sdc_client 0.158.2 → 0.158.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -74,7 +74,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
74
74
|
\*******************************************/
|
|
75
75
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
76
76
|
|
|
77
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SdcQuerySet: () => (/* binding */ SdcQuerySet),\n/* harmony export */ \"default\": () => (/* binding */ SdcModel)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\nclass SdcModelError extends Error {\n constructor(props) {\n if (typeof props === 'string') {\n props = {\n msg: props,\n is_error: true,\n header: 'Error'\n };\n }\n super(props.msg);\n this.msg = props.msg;\n this.header = props.header;\n this.is_error = props.is_error;\n this.html = props.html;\n }\n}\nclass FileLoaded {\n constructor({\n name,\n url\n }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\n async load(force = false) {\n if (force || !this.content) {\n this.content = await new Promise((resolve, reject) => {\n $.get(this.url).then(resolve).catch(() => {\n resolve('');\n });\n });\n }\n return this.content;\n }\n async text() {\n return this.load();\n }\n static isValid(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof File) && typeof value.url === \"string\" && typeof value.name === \"string\";\n }\n}\n\n/**\n * Normalize an incoming primary key value.\n *\n * `-1` is used throughout this module as the sentinel for \"new object / no pk\".\n *\n * @param {*} pk\n * @returns {number}\n */\nfunction normalizePk(pk) {\n const normalizedPk = parseInt(pk ?? -1, 10);\n return Number.isNaN(normalizedPk) ? -1 : normalizedPk;\n}\nclass SdcQuerySet {\n /**\n * Lightweight client-side collection wrapper around the SDC model websocket.\n *\n * The queryset exposes array-like access through a proxy while also keeping\n * track of socket state and outstanding requests for that model.\n *\n * @param {string} modelName\n * @param {object} modelQuery\n */\n constructor(modelName, modelQuery = {}) {\n this.valuesList = [];\n this.loaded = false;\n this.modelName = modelName;\n this.modelQuery = modelQuery ?? {};\n this._onNoOpenRequests = [];\n this._isConnected = false;\n this._isConnectingProcess = false;\n this._autoReconnect = true;\n this.socket = null;\n // Request resolvers are stored by websocket event id until the server responds.\n this.openRequest = {};\n this.modelId = 0;\n this.onUpdate = () => {};\n this.onCreate = () => {};\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop !== \"symbol\" && !isNaN(prop)) {\n return target.valuesList[prop];\n }\n return target[prop];\n },\n set(target, prop, value) {\n if (!isNaN(prop)) {\n target.valuesList[prop] = value;\n return true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return {\n value: this.valuesList[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n set on_create(handler) {\n this.onCreate = handler;\n }\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n setIds(ids) {\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet) {\n this.valuesList = structuredClone(ids.valuesList);\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n } else if (ids instanceof SdcModel) {\n this.valuesList = [structuredClone(ids)];\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n }\n let numList,\n numId = Number.NaN;\n if (Number.isInteger(ids)) {\n numId = ids;\n } else if (ids instanceof Array) {\n const tempNumList = ids.map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n }\n } else if (typeof ids === \"string\") {\n const tempNumList = ids.split(',').map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n } else {\n numId = parseInt(ids);\n }\n }\n if (!Number.isNaN(numId)) {\n const newModel = this.new();\n newModel.id = numId;\n } else if (numList) {\n this.valuesList = this.valuesList.filter(item => numList.includes(item.id));\n const valueIds = this.getIds();\n numList.filter(x => !valueIds.includes(x)).forEach(id => {\n this.valuesList.push(new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))({\n id\n }));\n });\n }\n return this.valuesList;\n }\n getIds() {\n return this.valuesList.map(x => x.id);\n }\n\n /**\n * Number of model instances currently present in the queryset cache.\n *\n * @returns {number}\n */\n get length() {\n return this.valuesList.length;\n }\n\n /**\n * Resolve a model instance by id, loading the queryset first if needed.\n *\n * @param {*} id\n * @returns {SdcModel|null}\n */\n byId(id) {\n if (id !== null) {\n const normalizedId = normalizePk(id);\n return this.valuesList.find(elm => elm.id === normalizedId) ?? null;\n }\n return null;\n }\n\n /**\n * Merge additional query constraints into the current queryset.\n *\n * @param {object} modelQuery\n * @returns {SdcQuerySet}\n */\n setFilter(modelQuery) {\n this.modelQuery = modelQuery;\n return this;\n }\n addFilter(modelQuery) {\n this.modelQuery = Object.assign({}, this.modelQuery, modelQuery);\n return this;\n }\n\n /**\n * @param {?object} values\n * @returns {SdcModel}\n */\n new(values = {}) {\n const newModel = new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))(values);\n newModel._setQuerySet(this, false);\n this.valuesList.push(newModel);\n return newModel;\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @returns {Promise<SdcQuerySet>}\n */\n load(modelQuery = null) {\n this.valuesList = [];\n this.modelQuery = modelQuery ?? this.modelQuery;\n return this._sendLoad();\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {?SdcModel} item\n * @returns {Promise<SdcQuerySet>}\n */\n update({\n modelQuery = null,\n item = null\n }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? {\n pk: item.id\n } : this.modelQuery;\n return this._sendLoad(loadQuery);\n }\n\n /**\n *\n * @param pk {integr}\n * @param elem {SdcModel}\n * @returns {Promise<unknown>}\n */\n delete({\n pk = null,\n elem = null\n }) {\n pk = !elem ? pk : elem.id;\n if (pk === null) {\n throw new Error(\"pk or elem must be set\");\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"delete\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n pk\n }\n }));\n this.openRequest[id] = [resolve, reject];\n });\n });\n }\n\n /**\n * Request the server-side queryset data over the model websocket.\n *\n * @returns {Promise<*>}\n */\n _sendLoad(loadQuery = null) {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"load\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: loadQuery ?? this.modelQuery\n }\n }));\n this.openRequest[id] = [data => {\n this.loaded = true;\n resolve(data);\n }, reject];\n });\n });\n }\n\n /**\n * Render the list-view endpoint for the current model.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendListView({\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this.view({\n modelQuery,\n cbResolve,\n cbReject,\n templateContext,\n eventType: \"list_view\"\n });\n }\n\n /**\n * Render a named model view and append its HTML to a container element.\n *\n * @param {object} options\n * @returns {*}\n */\n view({\n viewName = \"html_list_template\",\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n eventType = \"named_view\"\n }) {\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.modelName,\n model_query: modelQuery,\n template_context: templateContext\n }\n }));\n this.openRequest[id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Render the detail-view endpoint for a single model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendDetailView({\n pk = null,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n pk = normalizePk(pk);\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"detail_view\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n pk,\n template_context: templateContext\n }\n }));\n this.openRequest[id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Fetch a model form fragment and attach the SDC form metadata expected by\n * the rest of the client.\n *\n * @param {string} eventType\n * @param {SdcModel} modelObj\n */\n getForm({\n modelObj,\n eventType,\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId\n }) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const pk = modelObj.id ?? -1;\n this.isConnected().then(() => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id: id,\n args: {\n model_name: this.modelName,\n pk,\n form_name: formName\n }\n }));\n });\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n this.openRequest[id] = [data => {\n $divForm.append(data.html);\n let $form = $divForm.closest(\"form\").addClass(`sdc-model-${className}-form sdc-model-form ${formId}`).data(\"model\", modelObj).data(\"model_pk\", pk).data(\"form_name\", formName);\n modelObj.addForm($form);\n if ($form.length > 0 && !$form[0].hasAttribute(\"sdc_submit\")) {\n $form.attr(\"sdc_submit\", \"submitModelFormDistributor\");\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n }\n\n /**\n * Fetch a single model instance matching the current query.\n *\n * @param {?object} modelQuery\n * @param {?boolean} doNotLoad true if modelQuery contains id or pk and object does not need to be loaded.\n * @returns {Promise<SdcModel>}\n */\n async get(modelQuery = null, doNotLoad = false) {\n if (doNotLoad) {\n const id = modelQuery?.id ?? modelQuery?.pk;\n return this.byId(id) ?? this.new(modelQuery || this.modelQuery);\n }\n await this.load(modelQuery);\n if (this.length !== 1) {\n throw new Error(`model query returns ${this.length} but only 1 expected.`);\n }\n return this.valuesList[0];\n }\n detailView({\n pk,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendDetailView({\n pk,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n listView({\n modelQuery = {},\n searchValues = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, {\n '__search_values': searchValues\n }),\n cbResolve,\n cbReject,\n templateContext\n });\n }\n save({\n pk = null,\n formName = \"edit_form\",\n data = null\n } = {}) {\n const normPk = normalizePk(pk);\n return this.isConnected().then(() => {\n let elemList;\n if (normPk > -1) {\n const elem = this.byId(normPk);\n if (!elem) {\n return Promise.reject(new SdcModelError(`Element not found with ID: ${normPk}`));\n }\n elemList = [elem];\n } else {\n elemList = this.valuesList;\n }\n let pList = [];\n elemList.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n pList.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n const sendData = data ? {\n ...data\n } : elem.serialize();\n sendData.pk = elem.id;\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"save\",\n event_id: id,\n args: {\n form_name: formName,\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: sendData,\n pk: sendData.pk,\n files: files\n }\n }));\n this.openRequest[id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(pList);\n });\n }\n\n /**\n *\n * @param elem {?SdcModel}\n * @param data {?object}\n * @returns {Promise<unknown>}\n */\n create({\n elem = null,\n data = null\n } = {}) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n if (!elem) {\n elem = this.new(data);\n }\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"create\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: data ?? elem?.serialize() ?? {},\n files: files\n }\n }));\n this.openRequest[id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n if (elem) {\n elem.id = data[0]?.pk || data[0]?.id;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n\n /**\n * Ensure the websocket is open and has completed the server-side connect\n * handshake before issuing model requests.\n *\n * Multiple callers can arrive while a connection attempt is already in\n * progress. In that case they are queued behind the same synthetic request id.\n *\n * @returns {Promise<void>}\n */\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._isConnected) {\n resolve();\n } else if (!this._isConnectingProcess || !this.openRequest[CONNECTING_REQUEST_ID]) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] = this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n resolveOrigin();\n resolve();\n }, () => {\n rejectOrigin();\n reject();\n }];\n }\n });\n }\n\n /**\n * Close the websocket and disable automatic reconnect for this queryset.\n */\n close() {\n if (this.socket) {\n this._autoReconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this[\"socket\"];\n }\n this.valuesList.forEach(elem => {\n elem._onClose();\n });\n }\n\n /**\n * Upload attached `File` values in fixed-size chunks before save/create calls.\n *\n * @param {SdcModel} elem\n * @returns {Promise<object>}\n */\n _readFiles(elem) {\n let toSolve = [];\n let files = {};\n if (!elem) {\n return Promise.resolve(files);\n }\n Object.keys(elem.constructor.fields).forEach(key => {\n const value = elem[key];\n if (value instanceof File) {\n toSolve.push(new Promise(async (resolve, reject) => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[id] = [resolve, reject];\n const buffer = await value.arrayBuffer();\n let result = new Uint8Array(buffer);\n let numberOfChunks = Math.ceil(result.length / MAX_FILE_UPLOAD);\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < numberOfChunks; ++i) {\n const chunk = Array.from(result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)));\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"upload\",\n event_id: id,\n args: {\n chunk,\n idx: i,\n number_of_chunks: numberOfChunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n }\n }));\n }\n });\n return Promise.all(toSolve).then(() => {\n return files;\n });\n }\n\n /**\n * Route websocket responses to the matching pending request and update local\n * state when the server sends model payloads.\n *\n * @param {MessageEvent} e\n */\n async _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][1](new SdcModelError(data));\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this.openRequest[CONNECTING_REQUEST_ID][1](new SdcModelError(data));\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n this._autoReconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this._isConnected = true;\n this._isConnectingProcess = false;\n this.openRequest[CONNECTING_REQUEST_ID][0](data);\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n } else if ([\"load\", \"named_view\", \"detail_view\"].includes(data.type)) {\n const jsonRes = JSON.parse(data.args.data);\n data.args.data = await this._parseServerRes(jsonRes);\n } else if (data.type === \"on_update\" || data.type === \"on_create\") {\n const jsonRes = JSON.parse(data.args.data);\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n cb(obj);\n data.args.data = obj;\n }\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n\n /**\n * Wait until all in-flight websocket requests for this queryset are resolved.\n *\n * @returns {Promise<void>}\n */\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.openRequest).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n\n /**\n * Remove a completed request and wake any `noOpenRequests()` waiters when the\n * request map becomes empty.\n *\n * @param {string} eventId\n */\n _closeOpenRequest(eventId) {\n delete this.openRequest[eventId];\n if (Object.keys(this.openRequest).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n\n /**\n * Establish the raw websocket connection for this queryset.\n *\n * @returns {Promise<void>}\n */\n _connectToServer() {\n return new Promise(resolve => {\n const modelIdentifier = `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`);\n this._isConnected = false;\n for (const [_key, value] of Object.entries(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n setTimeout(() => {\n if (this._autoReconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._isConnected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n\n /**\n * Perform the application-level connect handshake once the websocket opens.\n *\n * @returns {Promise<*>}\n */\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"connect\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n this.openRequest[id] = [resolve, reject];\n });\n }\n\n /**\n * Convert the backend model payload into locally tracked model objects.\n *\n * @param {Array<object>} results\n */\n _parseServerRes(results) {\n const newModels = [];\n for (const x of results) {\n const ModelClass = (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName);\n if (!ModelClass) {\n throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);\n }\n const newModel = new ModelClass({\n 'id': x.pk ?? x.id,\n ...x.fields\n });\n const currentModel = this.byId(newModel.id);\n if (currentModel) {\n currentModel.setValues(newModel);\n newModels.push(currentModel);\n } else {\n this.valuesList.push(newModel);\n newModel._setQuerySet(this, true);\n newModels.push(newModel);\n }\n }\n this.valuesList.sort((a, b) => a._id - b._id);\n return newModels;\n }\n}\nclass SdcModel {\n static fields = {};\n\n /**\n * Base model wrapper used by SDC model registrations.\n *\n * @param {string} modelName\n */\n constructor(modelName) {\n this._id = null;\n this._forms = [];\n this.loaded = false;\n this.formId = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.modelName = modelName;\n }\n\n /**\n *\n * @param {object?} modelQuerySet\n * @param {AbstractSDC} parent\n * @returns {SdcQuerySet}\n */\n static querySet(modelQuerySet = null, parent = null) {\n if (!parent) {\n return new SdcQuerySet(this.modeName, modelQuerySet);\n }\n return parent.querySet(this.modeName, modelQuerySet);\n }\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n this._forms.push($form);\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\"input.formWatcher change.formWatcher\", \"input, select, textarea\", onChange);\n }\n }\n _onChange(event) {\n const {\n name\n } = event.target;\n if (this.constructor.fields[name]) {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n }\n }\n _updateForm(fieldName) {\n const self = this;\n this._forms.forEach($form => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName]);\n });\n });\n }\n setValues(data = {}) {\n throw new Error(\"setValues() must be implemented by subclass\");\n }\n\n /**\n * Attach the queryset that owns this model instance.\n *\n * @param {SdcQuerySet} querySet\n * @param {boolean} isLoaded\n */\n _setQuerySet(querySet, isLoaded) {\n this._querySet = new WeakRef(querySet);\n this.loaded = isLoaded;\n }\n save({\n formName = \"edit_form\",\n data = null\n } = {}) {\n return this._querySet.deref().save({\n pk: this.id,\n formName,\n data\n });\n }\n create({\n data = null\n } = {}) {\n return this._querySet.deref().create({\n elem: this,\n data\n });\n }\n delete() {\n return this._querySet.deref().delete({\n elem: this\n });\n }\n load() {\n return this._querySet.deref().update({\n item: this\n });\n }\n get id() {\n return this._id;\n }\n set pk(data) {\n this._id = data;\n }\n get pk() {\n return this._id;\n }\n close() {\n return this._querySet.deref().close();\n }\n _onClose() {\n Object.keys(this.constructor.fields).filter(x => this[`_${x}`] instanceof SdcQuerySet).forEach(x => this[`_${x}`].close());\n }\n\n /**\n * Request the server-rendered detail view for this model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n detailView({\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._querySet.deref().detailView({\n pk: this.id,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n serialize() {\n return Object.entries(this.constructor.fields).reduce((acc, [key, val]) => {\n const value = this[key];\n if (value instanceof SdcQuerySet) {\n if (val.many_to_many || val.one_to_many) {\n acc[key] = value.getIds();\n } else {\n const allIds = value.getIds();\n if (allIds.length > 0) {\n acc[key] = allIds[0];\n } else {\n acc[key] = null;\n }\n }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n }\n toJson() {\n const res = {};\n for (let key in this.constructor.fields) {\n const value = this[key];\n if (value instanceof File) {\n res[key] = value.name;\n } else if (value instanceof SdcModel) {\n res[key] = value.id;\n } else if (value instanceof SdcQuerySet) {\n res[key] = value.getIds();\n } else {\n res[key] = value;\n }\n }\n return res;\n }\n\n /**\n * Backwards-compatible alias for syncing values from a form into the model.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n\n /**\n * Resolve the form collection associated with this model instance.\n *\n * @param {*} $forms\n * @returns {*}\n */\n _resolveForms($forms) {\n if (!$forms || !$forms.hasClass(this.formId)) {\n return $(`.${this.formId}`);\n }\n return $forms;\n }\n\n /**\n * Copy the current model state into matching form fields.\n *\n * @param {*} $forms\n */\n syncModelToForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk) {\n return;\n }\n for (let formItem of this.elements) {\n let name = formItem.name;\n if (name && name !== \"\" && !!fields[name]) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(formItem, self[name]);\n }\n }\n });\n }\n\n /**\n * Copy matching form values back onto the current model instance.\n *\n * Hidden inputs are parsed to their original primitive type when possible.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n const returnValue = {};\n function setValueInForm(name, value) {\n if (!!fields[name]) {\n self[name] = value;\n }\n returnValue[name] = value;\n }\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk && (self.id !== null || pk !== -1)) {\n return;\n }\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n return self;\n });\n return returnValue;\n }\n\n /**\n * Render the correct server-side form for this model state.\n *\n * @param {object} options\n * @returns {*}\n */\n form({\n cbResolve = null,\n cbReject = null\n } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({\n cbReject,\n cbResolve\n });\n }\n return this._editForm({\n cbReject,\n cbResolve\n });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"create_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render the edit form for an existing model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _editForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"edit_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render a named server-side form for this model.\n *\n * @param {object} options\n * @returns {*}\n */\n namedForm({\n formName,\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $('<div class=\"container-fluid\">');\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"named_form\",\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Validate a field value using the supplied field config.\n *\n * @param {*} value\n * @param {object} config\n */\n validate(value, config) {\n const err = validateField(value, config);\n if (err) throw new Error(err);\n }\n\n /**\n * Convert a raw input value into the shape expected by the field config.\n *\n * @param {*} value\n * @param {object} config\n * @returns {*}\n */\n parseValue(value, config) {\n const {\n type\n } = config;\n switch (type) {\n case \"CharField\":\n case \"TeextField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n return parseInt(value, 10);\n case \"FloatField\":\n case \"DecimalField\":\n if (typeof value !== \"number\") {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n return !!value;\n case \"DateField\":\n case \"DateTimeField\":\n return Date.parse(value);\n case \"URLField\":\n return new URL(value);\n case \"FileField\":\n if (value == null) {\n return null;\n }\n if (typeof value === \"string\") {\n return null;\n }\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n if (config.max_size && value.size > config.max_size) {\n return `File too large (max ${config.max_size} bytes)`;\n }\n if (config.allowed_types && !config.allowed_types.includes(value.type)) {\n return `Invalid file type (${value.type})`;\n }\n return value;\n }\n break;\n case \"JSONField\":\n if (typeof value === \"object\") {\n return value;\n }\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n break;\n default:\n break;\n }\n return value;\n }\n}\n\n/**\n * Validate a field value against the field metadata received from the backend.\n *\n * @param {*} value\n * @param {object} config\n * @returns {?string}\n */\nfunction validateField(value, config) {\n const {\n type,\n required,\n max_length: maxLength,\n is_relation: isRelation,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n related_model: relatedModel\n } = config;\n void isRelation;\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n if (manyToMany || oneToMany || manyToOne || oneToOne) {\n if (!(value instanceof SdcQuerySet) || value.modelName !== relatedModel) {\n if (typeof value !== \"object\" && Number.isNaN(parseInt(value))) {\n return \"Must be object or ID\";\n }\n return null;\n }\n }\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n if (typeof value !== \"string\") {\n return \"Must be a string\";\n }\n if (maxLength && value.length > maxLength) {\n return `Max length is ${maxLength}`;\n }\n break;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n if (!Number.isInteger(value)) {\n return \"Must be an integer\";\n }\n break;\n case \"FloatField\":\n case \"DecimalField\":\n if (typeof value !== \"number\") {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n case \"UUIDField\":\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(value)) {\n return \"Invalid UUID\";\n }\n break;\n case \"JSONField\":\n if (typeof value !== \"object\") {\n return \"Must be JSON object\";\n }\n break;\n case \"FileField\":\n if (!FileLoaded.isValid(value) && !(value instanceof File) && !(value instanceof FileLoaded)) {\n return \"Must be a valid file\";\n }\n break;\n default:\n break;\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFFRixLQUFLLFlBQVk7TUFDZixJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzRQLElBQUksQ0FBQzVQLEtBQUssQ0FBQyxFQUFFO1FBQzFFLE9BQU8sZUFBZTtNQUN4QjtNQUNBO0lBRUYsS0FBSyxVQUFVO01BQ2IsSUFBSTtRQUNGLElBQUk0TyxHQUFHLENBQUM1TyxLQUFLLENBQUM7TUFDaEIsQ0FBQyxDQUFDLE1BQU07UUFDTixPQUFPLGFBQWE7TUFDdEI7TUFDQTtJQUVGLEtBQUssV0FBVztNQUNkLElBQUksQ0FBQywyRUFBMkUsQ0FBQzRQLElBQUksQ0FBQzVQLEtBQUssQ0FBQyxFQUFFO1FBQzVGLE9BQU8sY0FBYztNQUN2QjtNQUNBO0lBRUYsS0FBSyxXQUFXO01BQ2QsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8scUJBQXFCO01BQzlCO01BQ0E7SUFDRixLQUFLLFdBQVc7TUFDZCxJQUFJLENBQUNmLFVBQVUsQ0FBQ2MsT0FBTyxDQUFDQyxLQUFLLENBQUMsSUFBSSxFQUFFQSxLQUFLLFlBQVlHLElBQUksQ0FBQyxJQUFJLEVBQUVILEtBQUssWUFBWWYsVUFBVSxDQUFDLEVBQUU7UUFDNUYsT0FBTyxzQkFBc0I7TUFDL0I7TUFDQTtJQUNGO01BQ0U7RUFDSjtFQUVBLE9BQU8sSUFBSTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19tb2RlbC5qcz80NDM2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Z2V0VmFsdWVGcm9tRmllbGQsIHNldFZhbHVlSW5GaWVsZCwgdXVpZHY0fSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7Z2V0TW9kZWx9IGZyb20gXCIuL3NkY19zb2NrZXQuanNcIlxuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge3RyaWdnZXJ9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuY29uc3QgTUFYX0ZJTEVfVVBMT0FEID0gMjUwMDA7XG5jb25zdCBDT05ORUNUSU5HX1JFUVVFU1RfSUQgPSBcIl9jb25uZWN0aW5nX3Byb2Nlc3NcIjtcblxuY2xhc3MgU2RjTW9kZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIHByb3BzID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIG1zZzogcHJvcHMsXG4gICAgICAgIGlzX2Vycm9yOiB0cnVlLFxuICAgICAgICBoZWFkZXI6ICdFcnJvcidcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIocHJvcHMubXNnKVxuICAgIHRoaXMubXNnID0gcHJvcHMubXNnO1xuICAgIHRoaXMuaGVhZGVyID0gcHJvcHMuaGVhZGVyO1xuICAgIHRoaXMuaXNfZXJyb3IgPSBwcm9wcy5pc19lcnJvcjtcbiAgICB0aGlzLmh0bWwgPSBwcm9wcy5odG1sO1xuICB9XG59XG5cbmNsYXNzIEZpbGVMb2FkZWQge1xuICBjb25zdHJ1Y3Rvcih7bmFtZSwgdXJsfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5jb250ZW50ID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmIChmb3JjZSB8fCAhdGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICQuZ2V0KHRoaXMudXJsKS50aGVuKHJlc29sdmUpLmNhdGNoKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpICYmXG4gICAgICB0eXBlb2YgdmFsdWUudXJsID09PSBcInN0cmluZ1wiICYmXG4gICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICk7XG4gIH1cblxuXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGluY29taW5nIHByaW1hcnkga2V5IHZhbHVlLlxuICpcbiAqIGAtMWAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgbW9kdWxlIGFzIHRoZSBzZW50aW5lbCBmb3IgXCJuZXcgb2JqZWN0IC8gbm8gcGtcIi5cbiAqXG4gKiBAcGFyYW0geyp9IHBrXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQayhwaykge1xuICBjb25zdCBub3JtYWxpemVkUGsgPSBwYXJzZUludChwayA/PyAtMSwgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKG5vcm1hbGl6ZWRQaykgPyAtMSA6IG5vcm1hbGl6ZWRQaztcbn1cblxuZXhwb3J0IGNsYXNzIFNkY1F1ZXJ5U2V0IHtcbiAgLyoqXG4gICAqIExpZ2h0d2VpZ2h0IGNsaWVudC1zaWRlIGNvbGxlY3Rpb24gd3JhcHBlciBhcm91bmQgdGhlIFNEQyBtb2RlbCB3ZWJzb2NrZXQuXG4gICAqXG4gICAqIFRoZSBxdWVyeXNldCBleHBvc2VzIGFycmF5LWxpa2UgYWNjZXNzIHRocm91Z2ggYSBwcm94eSB3aGlsZSBhbHNvIGtlZXBpbmdcbiAgICogdHJhY2sgb2Ygc29ja2V0IHN0YXRlIGFuZCBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgdGhhdCBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxRdWVyeVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5ID0ge30pIHtcbiAgICB0aGlzLnZhbHVlc0xpc3QgPSBbXTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMubW9kZWxOYW1lID0gbW9kZWxOYW1lO1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnkgPz8ge307XG4gICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IGZhbHNlO1xuICAgIHRoaXMuX2F1dG9SZWNvbm5lY3QgPSB0cnVlO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAvLyBSZXF1ZXN0IHJlc29sdmVycyBhcmUgc3RvcmVkIGJ5IHdlYnNvY2tldCBldmVudCBpZCB1bnRpbCB0aGUgc2VydmVyIHJlc3BvbmRzLlxuICAgIHRoaXMub3BlblJlcXVlc3QgPSB7fTtcbiAgICB0aGlzLm1vZGVsSWQgPSAwO1xuICAgIHRoaXMub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICB0aGlzLm9uQ3JlYXRlID0gKCkgPT4ge1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN5bWJvbFwiICYmICFpc05hTihwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQudmFsdWVzTGlzdFtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgfSxcblxuICAgICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc05hTihwcm9wKSkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZXNMaXN0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgbGV0IGlkeCA9IC0xO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICsraWR4O1xuICAgICAgICBpZiAoaWR4IDwgdGhpcy52YWx1ZXNMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRoaXMudmFsdWVzTGlzdFtpZHhdLCBkb25lOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzZXQgb25fY3JlYXRlKGhhbmRsZXIpIHtcbiAgICB0aGlzLm9uQ3JlYXRlID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldCBvbl91cGRhdGUoaGFuZGxlcikge1xuICAgIHRoaXMub25VcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8aW50ZWdyfHN0cmluZz58aW50ZWdlcnxTZGNNb2RlbHxTZGNRdWVyeVNldHxzdHJpbmd9IGlkc1xuICAgKi9cbiAgc2V0SWRzKGlkcykge1xuXG4gICAgaWYgKGlkcyA9PT0gbnVsbCB8fCBpZHMgPT09IFwiXCIgfHwgQXJyYXkuaXNBcnJheShpZHMpICYmIGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoaWRzLnZhbHVlc0xpc3QpO1xuICAgICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2godmFsdWUgPT4gdmFsdWUuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfSBlbHNlIGlmIChpZHMgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gW3N0cnVjdHVyZWRDbG9uZShpZHMpXTtcbiAgICAgIHRoaXMudmFsdWVzTGlzdC5mb3JFYWNoKHZhbHVlID0+IHZhbHVlLl9zZXRRdWVyeVNldCh0aGlzLCB0cnVlKSk7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICAgIH1cblxuICAgIGxldCBudW1MaXN0LCBudW1JZCA9IE51bWJlci5OYU47XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoaWRzKSkge1xuICAgICAgbnVtSWQgPSBpZHM7XG4gICAgfSBlbHNlIGlmIChpZHMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgdGVtcE51bUxpc3QgPSBpZHMubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgICBpZiAoIXRlbXBOdW1MaXN0LnNvbWUoTnVtYmVyLmlzTmFOKSkge1xuICAgICAgICBudW1MaXN0ID0gdGVtcE51bUxpc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaWRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB0ZW1wTnVtTGlzdCA9IGlkcy5zcGxpdCgnLCcpLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCkpO1xuICAgICAgaWYgKCF0ZW1wTnVtTGlzdC5zb21lKE51bWJlci5pc05hTikpIHtcbiAgICAgICAgbnVtTGlzdCA9IHRlbXBOdW1MaXN0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1JZCA9IHBhcnNlSW50KGlkcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtSWQpKSB7XG4gICAgICBjb25zdCBuZXdNb2RlbCA9IHRoaXMubmV3KCk7XG4gICAgICBuZXdNb2RlbC5pZCA9IG51bUlkO1xuICAgIH0gZWxzZSBpZiAobnVtTGlzdCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gdGhpcy52YWx1ZXNMaXN0LmZpbHRlcigoaXRlbSkgPT4gbnVtTGlzdC5pbmNsdWRlcyhpdGVtLmlkKSk7XG4gICAgICBjb25zdCB2YWx1ZUlkcyA9IHRoaXMuZ2V0SWRzKCk7XG4gICAgICBudW1MaXN0LmZpbHRlcih4ID0+ICF2YWx1ZUlkcy5pbmNsdWRlcyh4KSkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3IChnZXRNb2RlbCh0aGlzLm1vZGVsTmFtZSkpKHtpZH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICB9XG5cbiAgZ2V0SWRzKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubWFwKHggPT4geC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIG1vZGVsIGluc3RhbmNlcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgcXVlcnlzZXQgY2FjaGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBtb2RlbCBpbnN0YW5jZSBieSBpZCwgbG9hZGluZyB0aGUgcXVlcnlzZXQgZmlyc3QgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGlkXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbHxudWxsfVxuICAgKi9cbiAgYnlJZChpZCkge1xuICAgIGlmIChpZCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplUGsoaWQpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdC5maW5kKChlbG0pID0+IGVsbS5pZCA9PT0gbm9ybWFsaXplZElkKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGFkZGl0aW9uYWwgcXVlcnkgY29uc3RyYWludHMgaW50byB0aGUgY3VycmVudCBxdWVyeXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc2V0RmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkRmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsUXVlcnksIG1vZGVsUXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbH1cbiAgICovXG4gIG5ldyh2YWx1ZXMgPSB7fSkge1xuICAgIGNvbnN0IG5ld01vZGVsID0gbmV3IChnZXRNb2RlbCh0aGlzLm1vZGVsTmFtZSkpKHZhbHVlcyk7XG4gICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLnZhbHVlc0xpc3QucHVzaChuZXdNb2RlbCk7XG4gICAgcmV0dXJuIG5ld01vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgbG9hZChtb2RlbFF1ZXJ5ID0gbnVsbCkge1xuICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnkgPz8gdGhpcy5tb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9zZW5kTG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHs/U2RjTW9kZWx9IGl0ZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgdXBkYXRlKHttb2RlbFF1ZXJ5ID0gbnVsbCwgaXRlbSA9IG51bGx9KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnk7XG4gICAgbGV0IGxvYWRRdWVyeSA9IGl0ZW0gPyB7cGs6IGl0ZW0uaWR9IDogdGhpcy5tb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9zZW5kTG9hZChsb2FkUXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwayB7aW50ZWdyfVxuICAgKiBAcGFyYW0gZWxlbSB7U2RjTW9kZWx9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgZGVsZXRlKHtwayA9IG51bGwsIGVsZW0gPSBudWxsfSkge1xuICAgIHBrID0gIWVsZW0gPyBwayA6IGVsZW0uaWQ7XG4gICAgaWYgKHBrID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwayBvciBlbGVtIG11c3QgYmUgc2V0XCIpO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBldmVudF90eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgcGssXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXItc2lkZSBxdWVyeXNldCBkYXRhIG92ZXIgdGhlIG1vZGVsIHdlYnNvY2tldC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gICAqL1xuICBfc2VuZExvYWQobG9hZFF1ZXJ5ID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJsb2FkXCIsXG4gICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogbG9hZFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtpZF0gPSBbKGRhdGEpPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LCByZWplY3RdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBsaXN0LXZpZXcgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50IG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9zZW5kTGlzdFZpZXcoe1xuICAgICAgICAgICAgICAgICAgbW9kZWxRdWVyeSA9IHt9LFxuICAgICAgICAgICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgICAgICAgIH0pIHtcbiAgICByZXR1cm4gdGhpcy52aWV3KHtcbiAgICAgIG1vZGVsUXVlcnksXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIHRlbXBsYXRlQ29udGV4dCxcbiAgICAgIGV2ZW50VHlwZTogXCJsaXN0X3ZpZXdcIixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBuYW1lZCBtb2RlbCB2aWV3IGFuZCBhcHBlbmQgaXRzIEhUTUwgdG8gYSBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICB2aWV3KHtcbiAgICAgICAgIHZpZXdOYW1lID0gXCJodG1sX2xpc3RfdGVtcGxhdGVcIixcbiAgICAgICAgIG1vZGVsUXVlcnkgPSB7fSxcbiAgICAgICAgIGNiUmVzb2x2ZSA9IG51bGwsXG4gICAgICAgICBjYlJlamVjdCA9IG51bGwsXG4gICAgICAgICB0ZW1wbGF0ZUNvbnRleHQgPSB7fSxcbiAgICAgICAgIGV2ZW50VHlwZSA9IFwibmFtZWRfdmlld1wiLFxuICAgICAgIH0pIHtcbiAgICBsZXQgJGRpdkxpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgdmlld19uYW1lOiB2aWV3TmFtZSxcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IG1vZGVsUXVlcnksXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0OiB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtcbiAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAkZGl2TGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2TGlzdCk7XG4gICAgICAgICAgY2JSZXNvbHZlICYmIGNiUmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZGV0YWlsLXZpZXcgZW5kcG9pbnQgZm9yIGEgc2luZ2xlIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9zZW5kRGV0YWlsVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIHBrID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnRleHQgPSB7fSxcbiAgICAgICAgICAgICAgICAgIH0pIHtcbiAgICBwayA9IG5vcm1hbGl6ZVBrKHBrKTtcbiAgICBsZXQgJGRpdkxpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG5cbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogXCJkZXRhaWxfdmlld1wiLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICBwayxcbiAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICRkaXZMaXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZMaXN0KTtcbiAgICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBtb2RlbCBmb3JtIGZyYWdtZW50IGFuZCBhdHRhY2ggdGhlIFNEQyBmb3JtIG1ldGFkYXRhIGV4cGVjdGVkIGJ5XG4gICAqIHRoZSByZXN0IG9mIHRoZSBjbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHtTZGNNb2RlbH0gbW9kZWxPYmpcbiAgICovXG4gIGdldEZvcm0oe21vZGVsT2JqLCBldmVudFR5cGUsIGZvcm1OYW1lLCAkZGl2Rm9ybSwgY2JSZXNvbHZlLCBjYlJlamVjdCwgZm9ybUlkfSkge1xuICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgY29uc3QgcGsgPSBtb2RlbE9iai5pZCA/PyAtMTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBldmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgcGssXG4gICAgICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBrID09PSBudWxsIHx8IHBrID09PSAtMSA/IFwiY3JlYXRlXCIgOiBcImVkaXRcIjtcblxuICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgJGRpdkZvcm0uYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgIGxldCAkZm9ybSA9ICRkaXZGb3JtXG4gICAgICAgICAgLmNsb3Nlc3QoXCJmb3JtXCIpXG4gICAgICAgICAgLmFkZENsYXNzKFxuICAgICAgICAgICAgYHNkYy1tb2RlbC0ke2NsYXNzTmFtZX0tZm9ybSBzZGMtbW9kZWwtZm9ybSAke2Zvcm1JZH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuZGF0YShcIm1vZGVsXCIsIG1vZGVsT2JqKVxuICAgICAgICAgIC5kYXRhKFwibW9kZWxfcGtcIiwgcGspXG4gICAgICAgICAgLmRhdGEoXCJmb3JtX25hbWVcIiwgZm9ybU5hbWUpO1xuICAgICAgICBtb2RlbE9iai5hZGRGb3JtKCRmb3JtKTtcbiAgICAgICAgaWYgKCRmb3JtLmxlbmd0aCA+IDAgJiYgISRmb3JtWzBdLmhhc0F0dHJpYnV0ZShcInNkY19zdWJtaXRcIikpIHtcbiAgICAgICAgICAkZm9ybS5hdHRyKFwic2RjX3N1Ym1pdFwiLCBcInN1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwLnJlZnJlc2goJGRpdkZvcm0pLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICB9LFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgc2luZ2xlIG1vZGVsIGluc3RhbmNlIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHs/Ym9vbGVhbn0gZG9Ob3RMb2FkIHRydWUgaWYgbW9kZWxRdWVyeSBjb250YWlucyBpZCBvciBwayBhbmQgb2JqZWN0IGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZGNNb2RlbD59XG4gICAqL1xuICBhc3luYyBnZXQobW9kZWxRdWVyeSA9IG51bGwsIGRvTm90TG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKGRvTm90TG9hZCkge1xuICAgICAgY29uc3QgaWQgPSBtb2RlbFF1ZXJ5Py5pZCA/PyBtb2RlbFF1ZXJ5Py5waztcbiAgICAgIHJldHVybiB0aGlzLmJ5SWQoaWQpID8/IHRoaXMubmV3KG1vZGVsUXVlcnkgfHwgdGhpcy5tb2RlbFF1ZXJ5KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2FkKG1vZGVsUXVlcnkpO1xuICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtb2RlbCBxdWVyeSByZXR1cm5zICR7dGhpcy5sZW5ndGh9IGJ1dCBvbmx5IDEgZXhwZWN0ZWQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdFswXTtcbiAgfVxuXG4gIGRldGFpbFZpZXcoe3BrLCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9fSkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kRGV0YWlsVmlldyh7XG4gICAgICBwayxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoe21vZGVsUXVlcnkgPSB7fSwgc2VhcmNoVmFsdWVzID0ge30sIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge319KSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRMaXN0Vmlldyh7XG4gICAgICBtb2RlbFF1ZXJ5OiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsUXVlcnksIG1vZGVsUXVlcnksIHsgJ19fc2VhcmNoX3ZhbHVlcyc6IHNlYXJjaFZhbHVlcyB9KSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgc2F2ZSh7cGsgPSBudWxsLCBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsfSA9IHt9KSB7XG4gICAgY29uc3Qgbm9ybVBrID0gbm9ybWFsaXplUGsocGspO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBsZXQgZWxlbUxpc3Q7XG4gICAgICBpZiAobm9ybVBrID4gLTEpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuYnlJZChub3JtUGspO1xuICAgICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFNkY01vZGVsRXJyb3IoYEVsZW1lbnQgbm90IGZvdW5kIHdpdGggSUQ6ICR7bm9ybVBrfWApKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtTGlzdCA9IFtlbGVtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1MaXN0ID0gdGhpcy52YWx1ZXNMaXN0O1xuICAgICAgfVxuICAgICAgbGV0IHBMaXN0ID0gW107XG4gICAgICBlbGVtTGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgIHBMaXN0LnB1c2goXG4gICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbmREYXRhID0gZGF0YSA/IHsuLi5kYXRhfSA6IGVsZW0uc2VyaWFsaXplKCk7XG4gICAgICAgICAgICAgIHNlbmREYXRhLnBrID0gZWxlbS5pZDtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJzYXZlXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzZW5kRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHNlbmREYXRhLnBrLFxuICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbSB7P1NkY01vZGVsfVxuICAgKiBAcGFyYW0gZGF0YSB7P29iamVjdH1cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBjcmVhdGUoe2VsZW0gPSBudWxsLCBkYXRhID0gbnVsbH0gPSB7fSkge1xuICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICBlbGVtID0gdGhpcy5uZXcoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl9yZWFkRmlsZXMoZWxlbSkudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICBldmVudF90eXBlOiBcImNyZWF0ZVwiLFxuICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgPz8gZWxlbT8uc2VyaWFsaXplKCkgPz8ge30sXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICBsZXQgZGF0YSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgICA6IHJlcy5kYXRhLmluc3RhbmNlO1xuICAgICAgICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgICAgICAgIGVsZW0uaWQgPSBkYXRhWzBdPy5wayB8fCBkYXRhWzBdPy5pZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpWzBdO1xuICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIF07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSB3ZWJzb2NrZXQgaXMgb3BlbiBhbmQgaGFzIGNvbXBsZXRlZCB0aGUgc2VydmVyLXNpZGUgY29ubmVjdFxuICAgKiBoYW5kc2hha2UgYmVmb3JlIGlzc3VpbmcgbW9kZWwgcmVxdWVzdHMuXG4gICAqXG4gICAqIE11bHRpcGxlIGNhbGxlcnMgY2FuIGFycml2ZSB3aGlsZSBhIGNvbm5lY3Rpb24gYXR0ZW1wdCBpcyBhbHJlYWR5IGluXG4gICAqIHByb2dyZXNzLiBJbiB0aGF0IGNhc2UgdGhleSBhcmUgcXVldWVkIGJlaGluZCB0aGUgc2FtZSBzeW50aGV0aWMgcmVxdWVzdCBpZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzQ29ubmVjdGVkKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICF0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzIHx8XG4gICAgICAgICF0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF1cbiAgICAgICkge1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdID0gWygpID0+IHtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9XTtcbiAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9jaGVja0Nvbm5lY3Rpb24oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3Jlc29sdmVPcmlnaW4sIHJlamVjdE9yaWdpbl0gPVxuICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXTtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdID0gW1xuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVPcmlnaW4oKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdE9yaWdpbigpO1xuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgd2Vic29ja2V0IGFuZCBkaXNhYmxlIGF1dG9tYXRpYyByZWNvbm5lY3QgZm9yIHRoaXMgcXVlcnlzZXQuXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2F1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICB9O1xuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgIGRlbGV0ZSB0aGlzW1wic29ja2V0XCJdO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWVzTGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLl9vbkNsb3NlKClcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYXR0YWNoZWQgYEZpbGVgIHZhbHVlcyBpbiBmaXhlZC1zaXplIGNodW5rcyBiZWZvcmUgc2F2ZS9jcmVhdGUgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSB7U2RjTW9kZWx9IGVsZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn1cbiAgICovXG4gIF9yZWFkRmlsZXMoZWxlbSkge1xuICAgIGxldCB0b1NvbHZlID0gW107XG4gICAgbGV0IGZpbGVzID0ge307XG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZpbGVzKTtcbiAgICB9XG4gICAgT2JqZWN0LmtleXMoZWxlbS5jb25zdHJ1Y3Rvci5maWVsZHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBlbGVtW2tleV07XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHRvU29sdmUucHVzaChcbiAgICAgICAgICBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcblxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdmFsdWUuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICAgICAgbGV0IG51bWJlck9mQ2h1bmtzID0gTWF0aC5jZWlsKHJlc3VsdC5sZW5ndGggLyBNQVhfRklMRV9VUExPQUQpO1xuICAgICAgICAgICAgZmlsZXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZkNodW5rczsgKytpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gQXJyYXkuZnJvbShyZXN1bHQuc2xpY2UoXG4gICAgICAgICAgICAgICAgTUFYX0ZJTEVfVVBMT0FEICogaSxcbiAgICAgICAgICAgICAgICBNQVhfRklMRV9VUExPQUQgKiAoaSArIDEpLFxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJ1cGxvYWRcIixcbiAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgICAgICAgICAgIGlkeDogaSxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NodW5rczogbnVtYmVyT2ZDaHVua3MsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodG9Tb2x2ZSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgd2Vic29ja2V0IHJlc3BvbnNlcyB0byB0aGUgbWF0Y2hpbmcgcGVuZGluZyByZXF1ZXN0IGFuZCB1cGRhdGUgbG9jYWxcbiAgICogc3RhdGUgd2hlbiB0aGUgc2VydmVyIHNlbmRzIG1vZGVsIHBheWxvYWRzLlxuICAgKlxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudH0gZVxuICAgKi9cbiAgYXN5bmMgX29uTWVzc2FnZShlKSB7XG4gICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgaWYgKGRhdGEuaXNfZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLm9wZW5SZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZGF0YS5ldmVudF9pZF1bMV0obmV3IFNkY01vZGVsRXJyb3IoZGF0YSkpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoXCJwdXNoRXJyb3JNc2dcIiwgZGF0YS5oZWFkZXIgfHwgXCJcIiwgZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwiY29ubmVjdFwiKSB7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVsxXShuZXcgU2RjTW9kZWxFcnJvcihkYXRhKSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoQ09OTkVDVElOR19SRVFVRVNUX0lEKTtcbiAgICAgICAgdGhpcy5fYXV0b1JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hNc2dcIiwgZGF0YS5oZWFkZXIgfHwgXCJcIiwgZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwiY29ubmVjdFwiKSB7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF1bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoQ09OTkVDVElOR19SRVFVRVNUX0lEKTtcbiAgICAgIH0gZWxzZSBpZiAoW1wibG9hZFwiLCBcIm5hbWVkX3ZpZXdcIiwgXCJkZXRhaWxfdmlld1wiXS5pbmNsdWRlcyhkYXRhLnR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBhd2FpdCB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uUmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBcIm9uX3VwZGF0ZVwiIHx8IGRhdGEudHlwZSA9PT0gXCJvbl9jcmVhdGVcIikge1xuICAgICAgICBjb25zdCBqc29uUmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG5cbiAgICAgICAgbGV0IG9iaiA9IGF3YWl0IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25SZXMpO1xuICAgICAgICBsZXQgY2I7XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJvbl9jcmVhdGVcIikge1xuICAgICAgICAgIGNiID0gdGhpcy5vbkNyZWF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25VcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjYihvYmopO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IG9iajtcbiAgICAgIH1cblxuICAgICAgbGV0IGluc3RhbmNlID0gZGF0YS5kYXRhPy5pbnN0YW5jZTtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBkYXRhLmRhdGEuaW5zdGFuY2UgPSBKU09OLnBhcnNlKGRhdGEuZGF0YS5pbnN0YW5jZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wZW5SZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZGF0YS5ldmVudF9pZF1bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgYWxsIGluLWZsaWdodCB3ZWJzb2NrZXQgcmVxdWVzdHMgZm9yIHRoaXMgcXVlcnlzZXQgYXJlIHJlc29sdmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIG5vT3BlblJlcXVlc3RzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3BlblJlcXVlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLnB1c2gocmVzb2x2ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29tcGxldGVkIHJlcXVlc3QgYW5kIHdha2UgYW55IGBub09wZW5SZXF1ZXN0cygpYCB3YWl0ZXJzIHdoZW4gdGhlXG4gICAqIHJlcXVlc3QgbWFwIGJlY29tZXMgZW1wdHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudElkXG4gICAqL1xuICBfY2xvc2VPcGVuUmVxdWVzdChldmVudElkKSB7XG4gICAgZGVsZXRlIHRoaXMub3BlblJlcXVlc3RbZXZlbnRJZF07XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3BlblJlcXVlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5mb3JFYWNoKCh4KSA9PiB4KCkpO1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2ggdGhlIHJhdyB3ZWJzb2NrZXQgY29ubmVjdGlvbiBmb3IgdGhpcyBxdWVyeXNldC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBfY29ubmVjdFRvU2VydmVyKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJZGVudGlmaWVyID1cbiAgICAgICAgYCR7dGhpcy5tb2RlbE5hbWV9YCArICh0aGlzLm1vZGVsSWQgPiAwID8gYC8ke3RoaXMubW9kZWxJZH1gIDogXCJcIik7XG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChcbiAgICAgICAgICBgd3NzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxJZGVudGlmaWVyfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXG4gICAgICAgICAgYHdzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxJZGVudGlmaWVyfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgU0RDIE1vZGVsICgke3RoaXMubW9kZWxOYW1lfSwgJHt0aGlzLm1vZGVsSWR9KSBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseWAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wZW5SZXF1ZXN0KSkge1xuICAgICAgICAgIHZhbHVlWzFdKGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3QgPSB7fTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fYXV0b1JlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFwcGxpY2F0aW9uLWxldmVsIGNvbm5lY3QgaGFuZHNoYWtlIG9uY2UgdGhlIHdlYnNvY2tldCBvcGVucy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gICAqL1xuICBfY2hlY2tDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY29ubmVjdFwiLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGJhY2tlbmQgbW9kZWwgcGF5bG9hZCBpbnRvIGxvY2FsbHkgdHJhY2tlZCBtb2RlbCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IHJlc3VsdHNcbiAgICovXG4gIF9wYXJzZVNlcnZlclJlcyhyZXN1bHRzKSB7XG4gICAgY29uc3QgbmV3TW9kZWxzID0gW11cbiAgICBmb3IgKGNvbnN0IHggb2YgcmVzdWx0cykge1xuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IGdldE1vZGVsKHRoaXMubW9kZWxOYW1lKTtcbiAgICAgIGlmKCFNb2RlbENsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gaXMgbm8gU2RjTW9kZWwuIG15YmUgdGhlIG1vZGVscyBhciBub3QgaW1wb3J0YWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyBNb2RlbENsYXNzKHsnaWQnOiB4LnBrID8/IHguaWQsIC4uLnguZmllbGRzfSk7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSB0aGlzLmJ5SWQobmV3TW9kZWwuaWQpO1xuICAgICAgaWYgKGN1cnJlbnRNb2RlbCkge1xuICAgICAgICBjdXJyZW50TW9kZWwuc2V0VmFsdWVzKG5ld01vZGVsKTtcbiAgICAgICAgbmV3TW9kZWxzLnB1c2goY3VycmVudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ld01vZGVsKTtcbiAgICAgICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChuZXdNb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudmFsdWVzTGlzdC5zb3J0KChhLCBiKSA9PiBhLl9pZCAtIGIuX2lkKTtcbiAgICByZXR1cm4gbmV3TW9kZWxzO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNkY01vZGVsIHtcbiAgc3RhdGljIGZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBCYXNlIG1vZGVsIHdyYXBwZXIgdXNlZCBieSBTREMgbW9kZWwgcmVnaXN0cmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxOYW1lKSB7XG4gICAgdGhpcy5faWQgPSBudWxsO1xuICAgIHRoaXMuX2Zvcm1zID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1JZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMubW9kZWxOYW1lID0gbW9kZWxOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0P30gbW9kZWxRdWVyeVNldFxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc3RhdGljIHF1ZXJ5U2V0KG1vZGVsUXVlcnlTZXQgPSBudWxsLCBwYXJlbnQgPSBudWxsKSB7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiBuZXcgU2RjUXVlcnlTZXQodGhpcy5tb2RlTmFtZSwgbW9kZWxRdWVyeVNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudC5xdWVyeVNldCh0aGlzLm1vZGVOYW1lLCBtb2RlbFF1ZXJ5U2V0KTtcbiAgfVxuXG4gIGFkZEZvcm0oJGZvcm0pIHtcbiAgICAvLyBSZW1vdmUgb2xkIGxpc3RlbmVycyBpZiBmb3JtIGFscmVhZHkgc2V0XG4gICAgY29uc3Qgb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fZm9ybXMucHVzaCgkZm9ybSk7XG5cbiAgICBpZiAoJGZvcm0pIHtcbiAgICAgIC8vIEF0dGFjaCBkZWxlZ2F0ZWQgZXZlbnQgaGFuZGxlciB0byBhbGwgaW5wdXRzXG4gICAgICAkZm9ybS5vbihcbiAgICAgICAgXCJpbnB1dC5mb3JtV2F0Y2hlciBjaGFuZ2UuZm9ybVdhdGNoZXJcIixcbiAgICAgICAgXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYVwiLFxuICAgICAgICBvbkNoYW5nZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBfb25DaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCB7bmFtZX0gPSBldmVudC50YXJnZXQ7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IuZmllbGRzW25hbWVdKSB7XG4gICAgICB0aGlzW2BzZXQke25hbWV9YF0oZ2V0VmFsdWVGcm9tRmllbGQoZXZlbnQudGFyZ2V0KSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUZvcm0oZmllbGROYW1lKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZm9ybXMuZm9yRWFjaCgoJGZvcm0pID0+IHtcbiAgICAgICRmb3JtLmZpbmQoYFtuYW1lPVwiJHtmaWVsZE5hbWV9XCJdYCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFZhbHVlSW5GaWVsZCh0aGlzLCBzZWxmW2ZpZWxkTmFtZV0pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFZhbHVlcyhkYXRhID0ge30pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXRWYWx1ZXMoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGUgcXVlcnlzZXQgdGhhdCBvd25zIHRoaXMgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7U2RjUXVlcnlTZXR9IHF1ZXJ5U2V0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMb2FkZWRcbiAgICovXG4gIF9zZXRRdWVyeVNldChxdWVyeVNldCwgaXNMb2FkZWQpIHtcbiAgICB0aGlzLl9xdWVyeVNldCA9IG5ldyBXZWFrUmVmKHF1ZXJ5U2V0KTtcbiAgICB0aGlzLmxvYWRlZCA9IGlzTG9hZGVkO1xuICB9XG5cbiAgc2F2ZSh7Zm9ybU5hbWUgPSBcImVkaXRfZm9ybVwiLCBkYXRhID0gbnVsbH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnNhdmUoe3BrOiB0aGlzLmlkLCBmb3JtTmFtZSwgZGF0YX0pO1xuICB9XG5cbiAgY3JlYXRlKHtkYXRhID0gbnVsbH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmNyZWF0ZSh7ZWxlbTogdGhpcywgZGF0YX0pO1xuICB9XG5cbiAgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRlbGV0ZSh7ZWxlbTogdGhpc30pO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS51cGRhdGUoe2l0ZW06IHRoaXN9KTtcbiAgfVxuXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBzZXQgcGsoZGF0YSkge1xuICAgIHRoaXMuX2lkID0gZGF0YTtcbiAgfVxuXG4gIGdldCBwaygpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jbG9zZSgpO1xuICB9XG5cbiAgX29uQ2xvc2UoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpXG4gICAgICAuZmlsdGVyKCh4KSA9PiB0aGlzW2BfJHt4fWBdIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpXG4gICAgICAuZm9yRWFjaCgoeCkgPT4gdGhpc1tgXyR7eH1gXS5jbG9zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXItcmVuZGVyZWQgZGV0YWlsIHZpZXcgZm9yIHRoaXMgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZGV0YWlsVmlldyh7Y2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsLCB0ZW1wbGF0ZUNvbnRleHQgPSB7fX0pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZXRhaWxWaWV3KHtwazogdGhpcy5pZCwgY2JSZXNvbHZlLCBjYlJlamVjdCwgdGVtcGxhdGVDb250ZXh0fSk7XG4gIH1cblxuICBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uc3RydWN0b3IuZmllbGRzKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkge1xuICAgICAgICBpZiAodmFsLm1hbnlfdG9fbWFueSB8fCB2YWwub25lX3RvX21hbnkpIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlLmdldElkcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsbElkcyA9IHZhbHVlLmdldElkcygpO1xuICAgICAgICAgIGlmIChhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBhbGxJZHNbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YWwuaXNfcmVsYXRpb24gJiYgdmFsdWUgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlLmlkID8/IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIGNvbnN0IHJlcyA9IHt9XG4gICAgZm9yIChsZXQga2V5IGluIHRoaXMuY29uc3RydWN0b3IuZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlLm5hbWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjTW9kZWwpIHtcbiAgICAgICAgcmVzW2tleV0gPSB2YWx1ZS5pZDtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlLmdldElkcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2t3YXJkcy1jb21wYXRpYmxlIGFsaWFzIGZvciBzeW5jaW5nIHZhbHVlcyBmcm9tIGEgZm9ybSBpbnRvIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBzeW5jRm9ybVRvTW9kZWwoJGZvcm1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc3luY0Zvcm0oJGZvcm1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBmb3JtIGNvbGxlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3Jlc29sdmVGb3JtcygkZm9ybXMpIHtcbiAgICBpZiAoISRmb3JtcyB8fCAhJGZvcm1zLmhhc0NsYXNzKHRoaXMuZm9ybUlkKSkge1xuICAgICAgcmV0dXJuICQoYC4ke3RoaXMuZm9ybUlkfWApO1xuICAgIH1cblxuICAgIHJldHVybiAkZm9ybXM7XG4gIH1cblxuICAvKipcbiAgICogQ29weSB0aGUgY3VycmVudCBtb2RlbCBzdGF0ZSBpbnRvIG1hdGNoaW5nIGZvcm0gZmllbGRzLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKi9cbiAgc3luY01vZGVsVG9Gb3JtKCRmb3Jtcykge1xuICAgICRmb3JtcyA9IHRoaXMuX3Jlc29sdmVGb3JtcygkZm9ybXMpO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHM7XG4gICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGsgPSBub3JtYWxpemVQaygkKHRoaXMpLmRhdGEoXCJtb2RlbF9wa1wiKSk7XG4gICAgICBpZiAoc2VsZi5pZCAhPT0gcGspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtSXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZm9ybUl0ZW0ubmFtZTtcbiAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gXCJcIiAmJiAhIWZpZWxkc1tuYW1lXSkge1xuICAgICAgICAgIHNldFZhbHVlSW5GaWVsZChmb3JtSXRlbSwgc2VsZltuYW1lXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgbWF0Y2hpbmcgZm9ybSB2YWx1ZXMgYmFjayBvbnRvIHRoZSBjdXJyZW50IG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBIaWRkZW4gaW5wdXRzIGFyZSBwYXJzZWQgdG8gdGhlaXIgb3JpZ2luYWwgcHJpbWl0aXZlIHR5cGUgd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBzeW5jRm9ybSgkZm9ybXMpIHtcbiAgICAkZm9ybXMgPSB0aGlzLl9yZXNvbHZlRm9ybXMoJGZvcm1zKTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuY29uc3RydWN0b3IuZmllbGRzO1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0ge31cblxuICAgIGZ1bmN0aW9uIHNldFZhbHVlSW5Gb3JtKG5hbWUsIHZhbHVlKSB7XG4gICAgICBpZiAoISFmaWVsZHNbbmFtZV0pIHtcbiAgICAgICAgc2VsZltuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWVbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwayA9IG5vcm1hbGl6ZVBrKCQodGhpcykuZGF0YShcIm1vZGVsX3BrXCIpKTtcbiAgICAgIGlmIChzZWxmLmlkICE9PSBwayAmJiAoc2VsZi5pZCAhPT0gbnVsbCB8fCBwayAhPT0gLTEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgZm9ybUl0ZW0gb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgICBzZXRWYWx1ZUluRm9ybShmb3JtSXRlbS5uYW1lLCBnZXRWYWx1ZUZyb21GaWVsZChmb3JtSXRlbSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNvcnJlY3Qgc2VydmVyLXNpZGUgZm9ybSBmb3IgdGhpcyBtb2RlbCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBmb3JtKHtjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGx9ID0ge30pIHtcbiAgICBpZiAodGhpcy5pZCA9PT0gbnVsbCB8fCB0aGlzLmlkID09PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUZvcm0oe2NiUmVqZWN0LCBjYlJlc29sdmV9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRGb3JtKHtjYlJlamVjdCwgY2JSZXNvbHZlfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjcmVhdGUgZm9ybSBmb3IgYSBuZXcgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX2NyZWF0ZUZvcm0oe2NiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG4gICAgdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5nZXRGb3JtKHtcbiAgICAgIG1vZGVsT2JqOiB0aGlzLFxuICAgICAgZXZlbnRUeXBlOiBcImNyZWF0ZV9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZWRpdCBmb3JtIGZvciBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfZWRpdEZvcm0oe2NiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwiZWRpdF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIHNlcnZlci1zaWRlIGZvcm0gZm9yIHRoaXMgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgbmFtZWRGb3JtKHtmb3JtTmFtZSwgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsfSkge1xuICAgIGxldCAkZGl2Rm9ybSA9ICQoJzxkaXYgIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwibmFtZWRfZm9ybVwiLFxuICAgICAgZm9ybU5hbWUsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpZWxkIHZhbHVlIHVzaW5nIHRoZSBzdXBwbGllZCBmaWVsZCBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICAgKi9cbiAgdmFsaWRhdGUodmFsdWUsIGNvbmZpZykge1xuICAgIGNvbnN0IGVyciA9IHZhbGlkYXRlRmllbGQodmFsdWUsIGNvbmZpZyk7XG4gICAgaWYgKGVycikgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHJhdyBpbnB1dCB2YWx1ZSBpbnRvIHRoZSBzaGFwZSBleHBlY3RlZCBieSB0aGUgZmllbGQgY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwYXJzZVZhbHVlKHZhbHVlLCBjb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlXG4gICAgfSA9IGNvbmZpZztcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkNoYXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIlRlZXh0RmllbGRcIjpcbiAgICAgIGNhc2UgXCJVVUlERmllbGRcIjpcbiAgICAgIGNhc2UgXCJFbWFpbEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuXG4gICAgICBjYXNlIFwiSW50ZWdlckZpZWxkXCI6XG4gICAgICBjYXNlIFwiQXV0b0ZpZWxkXCI6XG4gICAgICBjYXNlIFwiQmlnSW50ZWdlckZpZWxkXCI6XG4gICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgICAgY2FzZSBcIkRlY2ltYWxGaWVsZFwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIG51bWJlclwiO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiQm9vbGVhbkZpZWxkXCI6XG4gICAgICAgIHJldHVybiAhIXZhbHVlO1xuXG4gICAgICBjYXNlIFwiRGF0ZUZpZWxkXCI6XG4gICAgICBjYXNlIFwiRGF0ZVRpbWVGaWVsZFwiOlxuICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZSh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgXCJVUkxGaWVsZFwiOlxuICAgICAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgXCJGaWxlRmllbGRcIjpcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChGaWxlTG9hZGVkLmlzVmFsaWQodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9hZGVkKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMb2FkZWQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2FkZWQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBGaWxlICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgIGlmIChjb25maWcubWF4X3NpemUgJiYgdmFsdWUuc2l6ZSA+IGNvbmZpZy5tYXhfc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGBGaWxlIHRvbyBsYXJnZSAobWF4ICR7Y29uZmlnLm1heF9zaXplfSBieXRlcylgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZF90eXBlcyAmJiAhY29uZmlnLmFsbG93ZWRfdHlwZXMuaW5jbHVkZXModmFsdWUudHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgSW52YWxpZCBmaWxlIHR5cGUgKCR7dmFsdWUudHlwZX0pYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJKU09ORmllbGRcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGZpZWxkIHZhbHVlIGFnYWluc3QgdGhlIGZpZWxkIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHJldHVybnMgez9zdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmllbGQodmFsdWUsIGNvbmZpZykge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBtYXhfbGVuZ3RoOiBtYXhMZW5ndGgsXG4gICAgaXNfcmVsYXRpb246IGlzUmVsYXRpb24sXG4gICAgbWFueV90b19tYW55OiBtYW55VG9NYW55LFxuICAgIG9uZV90b19tYW55OiBvbmVUb01hbnksXG4gICAgbWFueV90b19vbmU6IG1hbnlUb09uZSxcbiAgICBvbmVfdG9fb25lOiBvbmVUb09uZSxcbiAgICByZWxhdGVkX21vZGVsOiByZWxhdGVkTW9kZWwsXG4gIH0gPSBjb25maWc7XG5cbiAgdm9pZCBpc1JlbGF0aW9uO1xuXG4gIGlmIChyZXF1aXJlZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChtYW55VG9NYW55IHx8IG9uZVRvTWFueSB8fCBtYW55VG9PbmUgfHwgb25lVG9PbmUpIHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB8fCB2YWx1ZS5tb2RlbE5hbWUgIT09IHJlbGF0ZWRNb2RlbCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiBOdW1iZXIuaXNOYU4ocGFyc2VJbnQodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIG9iamVjdCBvciBJRFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIkNoYXJGaWVsZFwiOlxuICAgIGNhc2UgXCJUZXh0RmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHN0cmluZ1wiO1xuICAgICAgfVxuICAgICAgaWYgKG1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGBNYXggbGVuZ3RoIGlzICR7bWF4TGVuZ3RofWA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiQXV0b0ZpZWxkXCI6XG4gICAgY2FzZSBcIkJpZ0ludGVnZXJGaWVsZFwiOlxuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGFuIGludGVnZXJcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZsb2F0RmllbGRcIjpcbiAgICBjYXNlIFwiRGVjaW1hbEZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSBudW1iZXJcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkJvb2xlYW5GaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIGJvb2xlYW5cIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkRhdGVGaWVsZFwiOlxuICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSB2YWxpZCBkYXRlXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJFbWFpbEZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8ICEvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIGVtYWlsXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVUkxGaWVsZFwiOlxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBVUkxcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgaWYgKCEvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBVVUlEXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJKU09ORmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBKU09OIG9iamVjdFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkZpbGVGaWVsZFwiOlxuICAgICAgaWYgKCFGaWxlTG9hZGVkLmlzVmFsaWQodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxvYWRlZCkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHZhbGlkIGZpbGVcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbImdldFZhbHVlRnJvbUZpZWxkIiwic2V0VmFsdWVJbkZpZWxkIiwidXVpZHY0IiwiZ2V0TW9kZWwiLCJhcHAiLCJ0cmlnZ2VyIiwiTUFYX0ZJTEVfVVBMT0FEIiwiQ09OTkVDVElOR19SRVFVRVNUX0lEIiwiU2RjTW9kZWxFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIm1zZyIsImlzX2Vycm9yIiwiaGVhZGVyIiwiaHRtbCIsIkZpbGVMb2FkZWQiLCJuYW1lIiwidXJsIiwiY29udGVudCIsImxvYWQiLCJmb3JjZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiJCIsImdldCIsInRoZW4iLCJjYXRjaCIsInRleHQiLCJpc1ZhbGlkIiwidmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJGaWxlIiwibm9ybWFsaXplUGsiLCJwayIsIm5vcm1hbGl6ZWRQayIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNOYU4iLCJTZGNRdWVyeVNldCIsIm1vZGVsTmFtZSIsIm1vZGVsUXVlcnkiLCJ2YWx1ZXNMaXN0IiwibG9hZGVkIiwiX29uTm9PcGVuUmVxdWVzdHMiLCJfaXNDb25uZWN0ZWQiLCJfaXNDb25uZWN0aW5nUHJvY2VzcyIsIl9hdXRvUmVjb25uZWN0Iiwic29ja2V0Iiwib3BlblJlcXVlc3QiLCJtb2RlbElkIiwib25VcGRhdGUiLCJvbkNyZWF0ZSIsIlByb3h5IiwidGFyZ2V0IiwicHJvcCIsInNldCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiaWR4IiwibmV4dCIsImxlbmd0aCIsImRvbmUiLCJvbl9jcmVhdGUiLCJoYW5kbGVyIiwib25fdXBkYXRlIiwic2V0SWRzIiwiaWRzIiwic3RydWN0dXJlZENsb25lIiwiZm9yRWFjaCIsIl9zZXRRdWVyeVNldCIsIlNkY01vZGVsIiwibnVtTGlzdCIsIm51bUlkIiwiTmFOIiwiaXNJbnRlZ2VyIiwidGVtcE51bUxpc3QiLCJtYXAiLCJ4Iiwic29tZSIsInNwbGl0IiwibmV3TW9kZWwiLCJuZXciLCJpZCIsImZpbHRlciIsIml0ZW0iLCJpbmNsdWRlcyIsInZhbHVlSWRzIiwiZ2V0SWRzIiwicHVzaCIsImJ5SWQiLCJub3JtYWxpemVkSWQiLCJmaW5kIiwiZWxtIiwic2V0RmlsdGVyIiwiYWRkRmlsdGVyIiwiT2JqZWN0IiwiYXNzaWduIiwidmFsdWVzIiwiX3NlbmRMb2FkIiwidXBkYXRlIiwibG9hZFF1ZXJ5IiwiZGVsZXRlIiwiZWxlbSIsImlzQ29ubmVjdGVkIiwic2VuZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudCIsImV2ZW50X3R5cGUiLCJldmVudF9pZCIsImFyZ3MiLCJtb2RlbF9uYW1lIiwibW9kZWxfcXVlcnkiLCJkYXRhIiwiX3NlbmRMaXN0VmlldyIsImNiUmVzb2x2ZSIsImNiUmVqZWN0IiwidGVtcGxhdGVDb250ZXh0IiwidmlldyIsImV2ZW50VHlwZSIsInZpZXdOYW1lIiwiJGRpdkxpc3QiLCJ2aWV3X25hbWUiLCJ0ZW1wbGF0ZV9jb250ZXh0IiwiYXBwZW5kIiwicmVmcmVzaCIsInJlcyIsIl9zZW5kRGV0YWlsVmlldyIsImdldEZvcm0iLCJtb2RlbE9iaiIsImZvcm1OYW1lIiwiJGRpdkZvcm0iLCJmb3JtSWQiLCJmb3JtX25hbWUiLCJjbGFzc05hbWUiLCIkZm9ybSIsImNsb3Nlc3QiLCJhZGRDbGFzcyIsImFkZEZvcm0iLCJoYXNBdHRyaWJ1dGUiLCJhdHRyIiwiZG9Ob3RMb2FkIiwiZGV0YWlsVmlldyIsImxpc3RWaWV3Iiwic2VhcmNoVmFsdWVzIiwic2F2ZSIsIm5vcm1QayIsImVsZW1MaXN0IiwicExpc3QiLCJfcmVhZEZpbGVzIiwiZmlsZXMiLCJzZW5kRGF0YSIsInNlcmlhbGl6ZSIsImluc3RhbmNlIiwicGFyc2UiLCJfcGFyc2VTZXJ2ZXJSZXMiLCJhbGwiLCJjcmVhdGUiLCJfY29ubmVjdFRvU2VydmVyIiwiX2NoZWNrQ29ubmVjdGlvbiIsInJlc29sdmVPcmlnaW4iLCJyZWplY3RPcmlnaW4iLCJjbG9zZSIsIm9uY2xvc2UiLCJfb25DbG9zZSIsInRvU29sdmUiLCJrZXlzIiwiZmllbGRzIiwia2V5IiwiYnVmZmVyIiwiYXJyYXlCdWZmZXIiLCJyZXN1bHQiLCJVaW50OEFycmF5IiwibnVtYmVyT2ZDaHVua3MiLCJNYXRoIiwiY2VpbCIsImZpbGVfbmFtZSIsImZpZWxkX25hbWUiLCJjb250ZW50X2xlbmd0aCIsInNpemUiLCJpIiwiY2h1bmsiLCJmcm9tIiwic2xpY2UiLCJudW1iZXJfb2ZfY2h1bmtzIiwiY29udGVudF90eXBlIiwidHlwZSIsIl9vbk1lc3NhZ2UiLCJlIiwiaGFzT3duUHJvcGVydHkiLCJfY2xvc2VPcGVuUmVxdWVzdCIsImpzb25SZXMiLCJvYmoiLCJjYiIsIm5vT3BlblJlcXVlc3RzIiwiZXZlbnRJZCIsIm1vZGVsSWRlbnRpZmllciIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJXZWJTb2NrZXQiLCJob3N0Iiwib25tZXNzYWdlIiwiYmluZCIsImNvbnNvbGUiLCJlcnJvciIsIl9rZXkiLCJlbnRyaWVzIiwic2V0VGltZW91dCIsIm9uZXJyb3IiLCJlcnIiLCJvbm9wZW4iLCJyZXN1bHRzIiwibmV3TW9kZWxzIiwiTW9kZWxDbGFzcyIsImN1cnJlbnRNb2RlbCIsInNldFZhbHVlcyIsInNvcnQiLCJhIiwiYiIsIl9pZCIsIl9mb3JtcyIsInF1ZXJ5U2V0IiwibW9kZWxRdWVyeVNldCIsInBhcmVudCIsIm1vZGVOYW1lIiwib25DaGFuZ2UiLCJfb25DaGFuZ2UiLCJvbiIsIl91cGRhdGVGb3JtIiwiZmllbGROYW1lIiwic2VsZiIsImVhY2giLCJpc0xvYWRlZCIsIl9xdWVyeVNldCIsIldlYWtSZWYiLCJkZXJlZiIsInJlZHVjZSIsImFjYyIsInZhbCIsIm1hbnlfdG9fbWFueSIsIm9uZV90b19tYW55IiwiYWxsSWRzIiwiaXNfcmVsYXRpb24iLCJ0b0pzb24iLCJzeW5jRm9ybVRvTW9kZWwiLCIkZm9ybXMiLCJzeW5jRm9ybSIsIl9yZXNvbHZlRm9ybXMiLCJoYXNDbGFzcyIsInN5bmNNb2RlbFRvRm9ybSIsImZvcm1JdGVtIiwiZWxlbWVudHMiLCJyZXR1cm5WYWx1ZSIsInNldFZhbHVlSW5Gb3JtIiwiZm9ybSIsIl9jcmVhdGVGb3JtIiwiX2VkaXRGb3JtIiwibmFtZWRGb3JtIiwidmFsaWRhdGUiLCJjb25maWciLCJ2YWxpZGF0ZUZpZWxkIiwicGFyc2VWYWx1ZSIsIkRhdGUiLCJVUkwiLCJtYXhfc2l6ZSIsImFsbG93ZWRfdHlwZXMiLCJyZXF1aXJlZCIsIm1heF9sZW5ndGgiLCJtYXhMZW5ndGgiLCJpc1JlbGF0aW9uIiwibWFueVRvTWFueSIsIm9uZVRvTWFueSIsIm1hbnlfdG9fb25lIiwibWFueVRvT25lIiwib25lX3RvX29uZSIsIm9uZVRvT25lIiwicmVsYXRlZF9tb2RlbCIsInJlbGF0ZWRNb2RlbCIsInVuZGVmaW5lZCIsInRlc3QiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
|
|
77
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SdcQuerySet: () => (/* binding */ SdcQuerySet),\n/* harmony export */ \"default\": () => (/* binding */ SdcModel)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\nclass SdcModelError extends Error {\n constructor(props) {\n if (typeof props === 'string') {\n props = {\n msg: props,\n is_error: true,\n header: 'Error'\n };\n }\n super(props.msg);\n this.msg = props.msg;\n this.header = props.header;\n this.is_error = props.is_error;\n this.html = props.html;\n }\n}\nclass FileLoaded {\n constructor({\n name,\n url\n }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\n async load(force = false) {\n if (force || !this.content) {\n this.content = await new Promise((resolve, reject) => {\n $.get(this.url).then(resolve).catch(() => {\n resolve('');\n });\n });\n }\n return this.content;\n }\n async text() {\n return this.load();\n }\n static isValid(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof File) && typeof value.url === \"string\" && typeof value.name === \"string\";\n }\n}\n\n/**\n * Normalize an incoming primary key value.\n *\n * `-1` is used throughout this module as the sentinel for \"new object / no pk\".\n *\n * @param {*} pk\n * @returns {number}\n */\nfunction normalizePk(pk) {\n const normalizedPk = parseInt(pk ?? -1, 10);\n return Number.isNaN(normalizedPk) ? -1 : normalizedPk;\n}\nclass SdcQuerySet {\n /**\n * Lightweight client-side collection wrapper around the SDC model websocket.\n *\n * The queryset exposes array-like access through a proxy while also keeping\n * track of socket state and outstanding requests for that model.\n *\n * @param {string} modelName\n * @param {object} modelQuery\n */\n constructor(modelName, modelQuery = {}) {\n this.valuesList = [];\n this.loaded = false;\n this.modelName = modelName;\n this.modelQuery = modelQuery ?? {};\n this._onNoOpenRequests = [];\n this._isConnected = false;\n this._isConnectingProcess = false;\n this._autoReconnect = true;\n this.socket = null;\n // Request resolvers are stored by websocket event id until the server responds.\n this.openRequest = {};\n this.modelId = 0;\n this.onUpdate = () => {};\n this.onCreate = () => {};\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop !== \"symbol\" && !isNaN(prop)) {\n return target.valuesList[prop];\n }\n return target[prop];\n },\n set(target, prop, value) {\n if (!isNaN(prop)) {\n target.valuesList[prop] = value;\n return true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return {\n value: this.valuesList[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n set on_create(handler) {\n this.onCreate = handler;\n }\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n setIds(ids) {\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet) {\n this.valuesList = structuredClone(ids.valuesList);\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n } else if (ids instanceof SdcModel) {\n this.valuesList = [structuredClone(ids)];\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n }\n let numList,\n numId = Number.NaN;\n if (Number.isInteger(ids)) {\n numId = ids;\n } else if (ids instanceof Array) {\n const tempNumList = ids.map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n }\n } else if (typeof ids === \"string\") {\n const tempNumList = ids.split(',').map(x => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n } else {\n numId = parseInt(ids);\n }\n }\n if (!Number.isNaN(numId)) {\n const newModel = this.new();\n newModel.id = numId;\n } else if (numList) {\n this.valuesList = this.valuesList.filter(item => numList.includes(item.id));\n const valueIds = this.getIds();\n numList.filter(x => !valueIds.includes(x)).forEach(id => {\n this.valuesList.push(new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))({\n id\n }));\n });\n }\n return this.valuesList;\n }\n getIds() {\n return this.valuesList.map(x => x.id);\n }\n\n /**\n * Number of model instances currently present in the queryset cache.\n *\n * @returns {number}\n */\n get length() {\n return this.valuesList.length;\n }\n\n /**\n * Resolve a model instance by id, loading the queryset first if needed.\n *\n * @param {*} id\n * @returns {SdcModel|null}\n */\n byId(id) {\n if (id !== null) {\n const normalizedId = normalizePk(id);\n return this.valuesList.find(elm => elm.id === normalizedId) ?? null;\n }\n return null;\n }\n\n /**\n * Merge additional query constraints into the current queryset.\n *\n * @param {object} modelQuery\n * @returns {SdcQuerySet}\n */\n setFilter(modelQuery) {\n this.modelQuery = modelQuery;\n return this;\n }\n addFilter(modelQuery) {\n this.modelQuery = Object.assign({}, this.modelQuery, modelQuery);\n return this;\n }\n\n /**\n * @param {?object} values\n * @returns {SdcModel}\n */\n new(values = {}) {\n const newModel = new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))(values);\n newModel._setQuerySet(this, false);\n this.valuesList.push(newModel);\n return newModel;\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @returns {Promise<SdcQuerySet>}\n */\n load(modelQuery = null) {\n this.valuesList = [];\n this.modelQuery = modelQuery ?? this.modelQuery;\n return this._sendLoad();\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {?SdcModel} item\n * @returns {Promise<SdcQuerySet>}\n */\n update({\n modelQuery = null,\n item = null\n }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? {\n pk: item.id\n } : this.modelQuery;\n return this._sendLoad(loadQuery);\n }\n\n /**\n *\n * @param pk {integr}\n * @param elem {SdcModel}\n * @returns {Promise<unknown>}\n */\n delete({\n pk = null,\n elem = null\n }) {\n pk = !elem ? pk : elem.id;\n if (pk === null) {\n throw new Error(\"pk or elem must be set\");\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"delete\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n pk\n }\n }));\n this.openRequest[id] = [resolve, reject];\n });\n });\n }\n\n /**\n * Request the server-side queryset data over the model websocket.\n *\n * @returns {Promise<*>}\n */\n _sendLoad(loadQuery = null) {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"load\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: loadQuery ?? this.modelQuery\n }\n }));\n this.openRequest[id] = [data => {\n this.loaded = true;\n resolve(data);\n }, reject];\n });\n });\n }\n\n /**\n * Render the list-view endpoint for the current model.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendListView({\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this.view({\n modelQuery,\n cbResolve,\n cbReject,\n templateContext,\n eventType: \"list_view\"\n });\n }\n\n /**\n * Render a named model view and append its HTML to a container element.\n *\n * @param {object} options\n * @returns {*}\n */\n view({\n viewName = \"html_list_template\",\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n eventType = \"named_view\"\n }) {\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.modelName,\n model_query: modelQuery,\n template_context: templateContext\n }\n }));\n this.openRequest[id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Render the detail-view endpoint for a single model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendDetailView({\n pk = null,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n pk = normalizePk(pk);\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"detail_view\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n pk,\n template_context: templateContext\n }\n }));\n this.openRequest[id] = [data => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $divList;\n }\n\n /**\n * Fetch a model form fragment and attach the SDC form metadata expected by\n * the rest of the client.\n *\n * @param {string} eventType\n * @param {SdcModel} modelObj\n */\n getForm({\n modelObj,\n eventType,\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId\n }) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const pk = modelObj.id ?? -1;\n this.isConnected().then(() => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id: id,\n args: {\n model_name: this.modelName,\n pk,\n form_name: formName\n }\n }));\n });\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n this.openRequest[id] = [data => {\n $divForm.append(data.html);\n let $form = $divForm.closest(\"form\").addClass(`sdc-model-${className}-form sdc-model-form ${formId}`).data(\"model\", modelObj).data(\"model_pk\", pk).data(\"form_name\", formName);\n modelObj.addForm($form);\n if ($form.length > 0 && !$form[0].hasAttribute(\"sdc_submit\")) {\n $form.attr(\"sdc_submit\", \"submitModelFormDistributor\");\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n }\n\n /**\n * Fetch a single model instance matching the current query.\n *\n * @param {?object} modelQuery\n * @param {?boolean} doNotLoad true if modelQuery contains id or pk and object does not need to be loaded.\n * @returns {Promise<SdcModel>}\n */\n async get(modelQuery = null, doNotLoad = false) {\n if (doNotLoad) {\n const id = modelQuery?.id ?? modelQuery?.pk;\n return this.byId(id) ?? this.new(modelQuery || this.modelQuery);\n }\n await this.load(modelQuery);\n if (this.length !== 1) {\n throw new Error(`model query returns ${this.length} but only 1 expected.`);\n }\n return this.valuesList[0];\n }\n detailView({\n pk,\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendDetailView({\n pk,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n listView({\n modelQuery = {},\n searchValues = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, {\n '__search_values': searchValues\n }),\n cbResolve,\n cbReject,\n templateContext\n });\n }\n save({\n pk = null,\n formName = \"edit_form\",\n data = null\n } = {}) {\n const normPk = normalizePk(pk);\n return this.isConnected().then(() => {\n let elemList;\n if (normPk > -1) {\n const elem = this.byId(normPk);\n if (!elem) {\n return Promise.reject(new SdcModelError(`Element not found with ID: ${normPk}`));\n }\n elemList = [elem];\n } else {\n elemList = this.valuesList;\n }\n let pList = [];\n elemList.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n pList.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n const sendData = data ? {\n ...data\n } : elem.serialize();\n sendData.pk = elem.id;\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"save\",\n event_id: id,\n args: {\n form_name: formName,\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: sendData,\n pk: sendData.pk,\n files: files\n }\n }));\n this.openRequest[id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(pList);\n });\n }\n\n /**\n *\n * @param elem {?SdcModel}\n * @param data {?object}\n * @returns {Promise<unknown>}\n */\n create({\n elem = null,\n data = null\n } = {}) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n if (!elem) {\n elem = this.new(data);\n }\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"create\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: data ?? elem?.serialize() ?? {},\n files: files\n }\n }));\n this.openRequest[id] = [res => {\n let data = typeof res.data.instance === \"string\" ? JSON.parse(res.data.instance) : res.data.instance;\n if (elem) {\n elem.id = data[0]?.pk || data[0]?.id;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n\n /**\n * Ensure the websocket is open and has completed the server-side connect\n * handshake before issuing model requests.\n *\n * Multiple callers can arrive while a connection attempt is already in\n * progress. In that case they are queued behind the same synthetic request id.\n *\n * @returns {Promise<void>}\n */\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._isConnected) {\n resolve();\n } else if (!this._isConnectingProcess || !this.openRequest[CONNECTING_REQUEST_ID]) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] = this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n resolveOrigin();\n resolve();\n }, () => {\n rejectOrigin();\n reject();\n }];\n }\n });\n }\n\n /**\n * Close the websocket and disable automatic reconnect for this queryset.\n */\n close() {\n if (this.socket) {\n this._autoReconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this[\"socket\"];\n }\n this.valuesList.forEach(elem => {\n elem._onClose();\n });\n }\n\n /**\n * Upload attached `File` values in fixed-size chunks before save/create calls.\n *\n * @param {SdcModel} elem\n * @returns {Promise<object>}\n */\n _readFiles(elem) {\n let toSolve = [];\n let files = {};\n if (!elem) {\n return Promise.resolve(files);\n }\n Object.keys(elem.constructor.fields).forEach(key => {\n const value = elem[key];\n if (value instanceof File) {\n toSolve.push(new Promise(async (resolve, reject) => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[id] = [resolve, reject];\n const buffer = await value.arrayBuffer();\n let result = new Uint8Array(buffer);\n let numberOfChunks = Math.ceil(result.length / MAX_FILE_UPLOAD);\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < numberOfChunks; ++i) {\n const chunk = Array.from(result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)));\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"upload\",\n event_id: id,\n args: {\n chunk,\n idx: i,\n number_of_chunks: numberOfChunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n }\n }));\n }\n });\n return Promise.all(toSolve).then(() => {\n return files;\n });\n }\n\n /**\n * Route websocket responses to the matching pending request and update local\n * state when the server sends model payloads.\n *\n * @param {MessageEvent} e\n */\n async _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][1](new SdcModelError(data));\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this.openRequest[CONNECTING_REQUEST_ID][1](new SdcModelError(data));\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n this._autoReconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.type === \"connect\") {\n this._isConnected = true;\n this._isConnectingProcess = false;\n this.openRequest[CONNECTING_REQUEST_ID][0](data);\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n } else if ([\"load\", \"named_view\", \"detail_view\"].includes(data.type)) {\n const jsonRes = JSON.parse(data.args.data);\n data.args.data = await this._parseServerRes(jsonRes);\n } else if (data.type === \"on_update\" || data.type === \"on_create\") {\n const jsonRes = JSON.parse(data.args.data);\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n cb(obj);\n data.args.data = obj;\n }\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n\n /**\n * Wait until all in-flight websocket requests for this queryset are resolved.\n *\n * @returns {Promise<void>}\n */\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.openRequest).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n\n /**\n * Remove a completed request and wake any `noOpenRequests()` waiters when the\n * request map becomes empty.\n *\n * @param {string} eventId\n */\n _closeOpenRequest(eventId) {\n delete this.openRequest[eventId];\n if (Object.keys(this.openRequest).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n\n /**\n * Establish the raw websocket connection for this queryset.\n *\n * @returns {Promise<void>}\n */\n _connectToServer() {\n return new Promise(resolve => {\n const modelIdentifier = `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`);\n this._isConnected = false;\n for (const [_key, value] of Object.entries(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n setTimeout(() => {\n if (this._autoReconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._isConnected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n\n /**\n * Perform the application-level connect handshake once the websocket opens.\n *\n * @returns {Promise<*>}\n */\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: \"model\",\n event_type: \"connect\",\n event_id: id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery\n }\n }));\n this.openRequest[id] = [resolve, reject];\n });\n }\n\n /**\n * Convert the backend model payload into locally tracked model objects.\n *\n * @param {Array<object>} results\n */\n _parseServerRes(results) {\n const newModels = [];\n for (const x of results) {\n const ModelClass = (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName);\n if (!ModelClass) {\n throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);\n }\n const newModel = new ModelClass({\n 'id': x.pk ?? x.id,\n ...x.fields\n });\n const currentModel = this.byId(newModel.id);\n if (currentModel) {\n currentModel.setValues(newModel);\n newModels.push(currentModel);\n } else {\n this.valuesList.push(newModel);\n newModel._setQuerySet(this, true);\n newModels.push(newModel);\n }\n }\n this.valuesList.sort((a, b) => a._id - b._id);\n return newModels;\n }\n}\nclass SdcModel {\n static fields = {};\n\n /**\n * Base model wrapper used by SDC model registrations.\n *\n * @param {string} modelName\n */\n constructor(modelName) {\n this._id = null;\n this._forms = [];\n this.loaded = false;\n this.formId = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.modelName = modelName;\n }\n\n /**\n *\n * @param {object?} modelQuerySet\n * @param {AbstractSDC} parent\n * @returns {SdcQuerySet}\n */\n static querySet(modelQuerySet = null, parent = null) {\n if (!parent) {\n return new SdcQuerySet(this.modeName, modelQuerySet);\n }\n return parent.querySet(this.modeName, modelQuerySet);\n }\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n this._forms.push($form);\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\"input.formWatcher change.formWatcher\", \"input, select, textarea\", onChange);\n }\n }\n _onChange(event) {\n const {\n name\n } = event.target;\n if (this.constructor.fields[name]) {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n }\n }\n _updateForm(fieldName) {\n const self = this;\n this._forms.forEach($form => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName]);\n });\n });\n }\n setValues(data = {}) {\n throw new Error(\"setValues() must be implemented by subclass\");\n }\n\n /**\n * Attach the queryset that owns this model instance.\n *\n * @param {SdcQuerySet} querySet\n * @param {boolean} isLoaded\n */\n _setQuerySet(querySet, isLoaded) {\n this._querySet = new WeakRef(querySet);\n this.loaded = isLoaded;\n }\n save({\n formName = \"edit_form\",\n data = null\n } = {}) {\n return this._querySet.deref().save({\n pk: this.id,\n formName,\n data\n });\n }\n create({\n data = null\n } = {}) {\n return this._querySet.deref().create({\n elem: this,\n data\n });\n }\n delete() {\n return this._querySet.deref().delete({\n elem: this\n });\n }\n load() {\n return this._querySet.deref().update({\n item: this\n });\n }\n get id() {\n return this._id;\n }\n set pk(data) {\n this._id = data;\n }\n get pk() {\n return this._id;\n }\n close() {\n return this._querySet.deref().close();\n }\n _onClose() {\n Object.keys(this.constructor.fields).filter(x => this[`_${x}`] instanceof SdcQuerySet).forEach(x => this[`_${x}`].close());\n }\n\n /**\n * Request the server-rendered detail view for this model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n detailView({\n cbResolve = null,\n cbReject = null,\n templateContext = {}\n }) {\n return this._querySet.deref().detailView({\n pk: this.id,\n cbResolve,\n cbReject,\n templateContext\n });\n }\n serialize() {\n return Object.entries(this.constructor.fields).reduce((acc, [key, val]) => {\n const value = this[key];\n if (value instanceof SdcQuerySet) {\n if (val.many_to_many || val.one_to_many) {\n acc[key] = value.getIds();\n } else {\n const allIds = value.getIds();\n if (allIds.length > 0) {\n acc[key] = allIds[0];\n } else {\n acc[key] = null;\n }\n }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n }\n toJson() {\n const res = {};\n for (let key in this.constructor.fields) {\n const value = this[key];\n if (value instanceof File) {\n res[key] = value.name;\n } else if (value instanceof SdcModel) {\n res[key] = value.id;\n } else if (value instanceof SdcQuerySet) {\n res[key] = value.getIds();\n } else {\n res[key] = value;\n }\n }\n return res;\n }\n\n /**\n * Backwards-compatible alias for syncing values from a form into the model.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n\n /**\n * Resolve the form collection associated with this model instance.\n *\n * @param {*} $forms\n * @returns {*}\n */\n _resolveForms($forms) {\n if (!$forms || !$forms.hasClass(this.formId)) {\n return $(`.${this.formId}`);\n }\n return $forms;\n }\n\n /**\n * Copy the current model state into matching form fields.\n *\n * @param {*} $forms\n */\n syncModelToForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk) {\n return;\n }\n for (let formItem of this.elements) {\n let name = formItem.name;\n if (name && name !== \"\" && !!fields[name]) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(formItem, self[name]);\n }\n }\n });\n }\n\n /**\n * Copy matching form values back onto the current model instance.\n *\n * Hidden inputs are parsed to their original primitive type when possible.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncForm($forms) {\n $forms = this._resolveForms($forms);\n const self = this;\n const fields = this.constructor.fields;\n const returnValue = {};\n function setValueInForm(name, value) {\n if (!!fields[name]) {\n self[name] = value;\n }\n returnValue[name] = value;\n }\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk && (self.id !== null || pk !== -1)) {\n return;\n }\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n return self;\n });\n return returnValue;\n }\n\n /**\n * Render the correct server-side form for this model state.\n *\n * @param {object} options\n * @returns {*}\n */\n form({\n cbResolve = null,\n cbReject = null\n } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({\n cbReject,\n cbResolve\n });\n }\n return this._editForm({\n cbReject,\n cbResolve\n });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"create_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render the edit form for an existing model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _editForm({\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"edit_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Render a named server-side form for this model.\n *\n * @param {object} options\n * @returns {*}\n */\n namedForm({\n formName,\n cbResolve = null,\n cbReject = null\n }) {\n let $divForm = $('<div class=\"container-fluid\">');\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"named_form\",\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId\n });\n return $divForm;\n }\n\n /**\n * Validate a field value using the supplied field config.\n *\n * @param {*} value\n * @param {object} config\n */\n validate(value, config) {\n const err = validateField(value, config);\n if (err) throw new Error(err);\n }\n\n /**\n * Convert a raw input value into the shape expected by the field config.\n *\n * @param {*} value\n * @param {object} config\n * @returns {*}\n */\n parseValue(value, config) {\n const {\n type\n } = config;\n if (value === null) {\n return null;\n }\n switch (type) {\n case \"CharField\":\n case \"TeextField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n return parseInt(value, 10);\n case \"FloatField\":\n case \"DecimalField\":\n if (typeof value !== \"number\") {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n return !!value;\n case \"DateField\":\n case \"DateTimeField\":\n return Date.parse(value);\n case \"URLField\":\n return new URL(value);\n case \"FileField\":\n if (value == null) {\n return null;\n }\n if (typeof value === \"string\") {\n return null;\n }\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n if (config.max_size && value.size > config.max_size) {\n return `File too large (max ${config.max_size} bytes)`;\n }\n if (config.allowed_types && !config.allowed_types.includes(value.type)) {\n return `Invalid file type (${value.type})`;\n }\n return value;\n }\n break;\n case \"JSONField\":\n if (typeof value === \"object\") {\n return value;\n }\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n break;\n default:\n break;\n }\n return value;\n }\n}\n\n/**\n * Validate a field value against the field metadata received from the backend.\n *\n * @param {*} value\n * @param {object} config\n * @returns {?string}\n */\nfunction validateField(value, config) {\n const {\n type,\n required,\n max_length: maxLength,\n is_relation: isRelation,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n related_model: relatedModel\n } = config;\n void isRelation;\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n if (manyToMany || oneToMany || manyToOne || oneToOne) {\n if (!(value instanceof SdcQuerySet) || value.modelName !== relatedModel) {\n if (typeof value !== \"object\" && Number.isNaN(parseInt(value))) {\n return \"Must be object or ID\";\n }\n return null;\n }\n }\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n if (typeof value !== \"string\") {\n return \"Must be a string\";\n }\n if (maxLength && value.length > maxLength) {\n return `Max length is ${maxLength}`;\n }\n break;\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n if (!Number.isInteger(value)) {\n return \"Must be an integer\";\n }\n break;\n case \"FloatField\":\n case \"DecimalField\":\n if (typeof value !== \"number\") {\n return \"Must be a number\";\n }\n break;\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n case \"UUIDField\":\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(value)) {\n return \"Invalid UUID\";\n }\n break;\n case \"JSONField\":\n if (typeof value !== \"object\") {\n return \"Must be JSON object\";\n }\n break;\n case \"FileField\":\n if (!FileLoaded.isValid(value) && !(value instanceof File) && !(value instanceof FileLoaded)) {\n return \"Must be a valid file\";\n }\n break;\n default:\n break;\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUM5SCxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzVCLE9BQU8sc0JBQXNCO01BQy9CO01BQ0E7SUFFRixLQUFLLFlBQVk7TUFDZixJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyw0QkFBNEIsQ0FBQzRQLElBQUksQ0FBQzVQLEtBQUssQ0FBQyxFQUFFO1FBQzFFLE9BQU8sZUFBZTtNQUN4QjtNQUNBO0lBRUYsS0FBSyxVQUFVO01BQ2IsSUFBSTtRQUNGLElBQUk0TyxHQUFHLENBQUM1TyxLQUFLLENBQUM7TUFDaEIsQ0FBQyxDQUFDLE1BQU07UUFDTixPQUFPLGFBQWE7TUFDdEI7TUFDQTtJQUVGLEtBQUssV0FBVztNQUNkLElBQUksQ0FBQywyRUFBMkUsQ0FBQzRQLElBQUksQ0FBQzVQLEtBQUssQ0FBQyxFQUFFO1FBQzVGLE9BQU8sY0FBYztNQUN2QjtNQUNBO0lBRUYsS0FBSyxXQUFXO01BQ2QsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8scUJBQXFCO01BQzlCO01BQ0E7SUFDRixLQUFLLFdBQVc7TUFDZCxJQUFJLENBQUNmLFVBQVUsQ0FBQ2MsT0FBTyxDQUFDQyxLQUFLLENBQUMsSUFBSSxFQUFFQSxLQUFLLFlBQVlHLElBQUksQ0FBQyxJQUFJLEVBQUVILEtBQUssWUFBWWYsVUFBVSxDQUFDLEVBQUU7UUFDNUYsT0FBTyxzQkFBc0I7TUFDL0I7TUFDQTtJQUNGO01BQ0U7RUFDSjtFQUVBLE9BQU8sSUFBSTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19tb2RlbC5qcz80NDM2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFZhbHVlRnJvbUZpZWxkLCBzZXRWYWx1ZUluRmllbGQsIHV1aWR2NCB9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgZ2V0TW9kZWwgfSBmcm9tIFwiLi9zZGNfc29ja2V0LmpzXCJcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG5jb25zdCBNQVhfRklMRV9VUExPQUQgPSAyNTAwMDtcbmNvbnN0IENPTk5FQ1RJTkdfUkVRVUVTVF9JRCA9IFwiX2Nvbm5lY3RpbmdfcHJvY2Vzc1wiO1xuXG5jbGFzcyBTZGNNb2RlbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIGlmICh0eXBlb2YgcHJvcHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm9wcyA9IHtcbiAgICAgICAgbXNnOiBwcm9wcyxcbiAgICAgICAgaXNfZXJyb3I6IHRydWUsXG4gICAgICAgIGhlYWRlcjogJ0Vycm9yJ1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlcihwcm9wcy5tc2cpXG4gICAgdGhpcy5tc2cgPSBwcm9wcy5tc2c7XG4gICAgdGhpcy5oZWFkZXIgPSBwcm9wcy5oZWFkZXI7XG4gICAgdGhpcy5pc19lcnJvciA9IHByb3BzLmlzX2Vycm9yO1xuICAgIHRoaXMuaHRtbCA9IHByb3BzLmh0bWw7XG4gIH1cbn1cblxuY2xhc3MgRmlsZUxvYWRlZCB7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZSwgdXJsIH0pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMuY29udGVudCA9IG51bGw7XG4gIH1cblxuICBhc3luYyBsb2FkKGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoZm9yY2UgfHwgIXRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5jb250ZW50ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAkLmdldCh0aGlzLnVybCkudGhlbihyZXNvbHZlKS5jYXRjaChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50O1xuICB9XG5cbiAgYXN5bmMgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkKCk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZCh2YWx1ZSkge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLnVybCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdHlwZW9mIHZhbHVlLm5hbWUgPT09IFwic3RyaW5nXCJcbiAgICApO1xuICB9XG5cblxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbiBpbmNvbWluZyBwcmltYXJ5IGtleSB2YWx1ZS5cbiAqXG4gKiBgLTFgIGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIG1vZHVsZSBhcyB0aGUgc2VudGluZWwgZm9yIFwibmV3IG9iamVjdCAvIG5vIHBrXCIuXG4gKlxuICogQHBhcmFtIHsqfSBwa1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGsocGspIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBrID0gcGFyc2VJbnQocGsgPz8gLTEsIDEwKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihub3JtYWxpemVkUGspID8gLTEgOiBub3JtYWxpemVkUGs7XG59XG5cbmV4cG9ydCBjbGFzcyBTZGNRdWVyeVNldCB7XG4gIC8qKlxuICAgKiBMaWdodHdlaWdodCBjbGllbnQtc2lkZSBjb2xsZWN0aW9uIHdyYXBwZXIgYXJvdW5kIHRoZSBTREMgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBUaGUgcXVlcnlzZXQgZXhwb3NlcyBhcnJheS1saWtlIGFjY2VzcyB0aHJvdWdoIGEgcHJveHkgd2hpbGUgYWxzbyBrZWVwaW5nXG4gICAqIHRyYWNrIG9mIHNvY2tldCBzdGF0ZSBhbmQgb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIHRoYXQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsTmFtZSA9IG1vZGVsTmFtZTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHt9O1xuICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgLy8gUmVxdWVzdCByZXNvbHZlcnMgYXJlIHN0b3JlZCBieSB3ZWJzb2NrZXQgZXZlbnQgaWQgdW50aWwgdGhlIHNlcnZlciByZXNwb25kcy5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0ID0ge307XG4gICAgdGhpcy5tb2RlbElkID0gMDtcbiAgICB0aGlzLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgIH07XG4gICAgdGhpcy5vbkNyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiAhaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0LnZhbHVlc0xpc3RbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgIH0sXG5cbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWVzTGlzdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBpZHggPSAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICArK2lkeDtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudmFsdWVzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy52YWx1ZXNMaXN0W2lkeF0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHNldCBvbl9jcmVhdGUoaGFuZGxlcikge1xuICAgIHRoaXMub25DcmVhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uX3VwZGF0ZShoYW5kbGVyKSB7XG4gICAgdGhpcy5vblVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxpbnRlZ3J8c3RyaW5nPnxpbnRlZ2VyfFNkY01vZGVsfFNkY1F1ZXJ5U2V0fHN0cmluZ30gaWRzXG4gICAqL1xuICBzZXRJZHMoaWRzKSB7XG5cbiAgICBpZiAoaWRzID09PSBudWxsIHx8IGlkcyA9PT0gXCJcIiB8fCBBcnJheS5pc0FycmF5KGlkcykgJiYgaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICAgIH0gZWxzZSBpZiAoaWRzIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHN0cnVjdHVyZWRDbG9uZShpZHMudmFsdWVzTGlzdCk7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZS5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSkpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSBbc3RydWN0dXJlZENsb25lKGlkcyldO1xuICAgICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2godmFsdWUgPT4gdmFsdWUuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfVxuXG4gICAgbGV0IG51bUxpc3QsIG51bUlkID0gTnVtYmVyLk5hTjtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpZHMpKSB7XG4gICAgICBudW1JZCA9IGlkcztcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB0ZW1wTnVtTGlzdCA9IGlkcy5tYXAoKHgpID0+IHBhcnNlSW50KHgpKTtcbiAgICAgIGlmICghdGVtcE51bUxpc3Quc29tZShOdW1iZXIuaXNOYU4pKSB7XG4gICAgICAgIG51bUxpc3QgPSB0ZW1wTnVtTGlzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRlbXBOdW1MaXN0ID0gaWRzLnNwbGl0KCcsJykubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgICBpZiAoIXRlbXBOdW1MaXN0LnNvbWUoTnVtYmVyLmlzTmFOKSkge1xuICAgICAgICBudW1MaXN0ID0gdGVtcE51bUxpc3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bUlkID0gcGFyc2VJbnQoaWRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihudW1JZCkpIHtcbiAgICAgIGNvbnN0IG5ld01vZGVsID0gdGhpcy5uZXcoKTtcbiAgICAgIG5ld01vZGVsLmlkID0gbnVtSWQ7XG4gICAgfSBlbHNlIGlmIChudW1MaXN0KSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSB0aGlzLnZhbHVlc0xpc3QuZmlsdGVyKChpdGVtKSA9PiBudW1MaXN0LmluY2x1ZGVzKGl0ZW0uaWQpKTtcbiAgICAgIGNvbnN0IHZhbHVlSWRzID0gdGhpcy5nZXRJZHMoKTtcbiAgICAgIG51bUxpc3QuZmlsdGVyKHggPT4gIXZhbHVlSWRzLmluY2x1ZGVzKHgpKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlc0xpc3QucHVzaChuZXcgKGdldE1vZGVsKHRoaXMubW9kZWxOYW1lKSkoeyBpZCB9KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgfVxuXG4gIGdldElkcygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0Lm1hcCh4ID0+IHguaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBtb2RlbCBpbnN0YW5jZXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbW9kZWwgaW5zdGFuY2UgYnkgaWQsIGxvYWRpbmcgdGhlIHF1ZXJ5c2V0IGZpcnN0IGlmIG5lZWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBpZFxuICAgKiBAcmV0dXJucyB7U2RjTW9kZWx8bnVsbH1cbiAgICovXG4gIGJ5SWQoaWQpIHtcbiAgICBpZiAoaWQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IG5vcm1hbGl6ZVBrKGlkKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QuZmluZCgoZWxtKSA9PiBlbG0uaWQgPT09IG5vcm1hbGl6ZWRJZCkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzIGludG8gdGhlIGN1cnJlbnQgcXVlcnlzZXQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtTZGNRdWVyeVNldH1cbiAgICovXG4gIHNldEZpbHRlcihtb2RlbFF1ZXJ5KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEZpbHRlcihtb2RlbFF1ZXJ5KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbFF1ZXJ5LCBtb2RlbFF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyB7U2RjTW9kZWx9XG4gICAqL1xuICBuZXcodmFsdWVzID0ge30pIHtcbiAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyAoZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpKSh2YWx1ZXMpO1xuICAgIG5ld01vZGVsLl9zZXRRdWVyeVNldCh0aGlzLCBmYWxzZSk7XG4gICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3TW9kZWwpO1xuICAgIHJldHVybiBuZXdNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIG1vZGVsIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeSBpbnRvIHRoZSBxdWVyeXNldCBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNkY1F1ZXJ5U2V0Pn1cbiAgICovXG4gIGxvYWQobW9kZWxRdWVyeSA9IG51bGwpIHtcbiAgICB0aGlzLnZhbHVlc0xpc3QgPSBbXTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIG1vZGVsIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeSBpbnRvIHRoZSBxdWVyeXNldCBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEBwYXJhbSB7P1NkY01vZGVsfSBpdGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNkY1F1ZXJ5U2V0Pn1cbiAgICovXG4gIHVwZGF0ZSh7IG1vZGVsUXVlcnkgPSBudWxsLCBpdGVtID0gbnVsbCB9KSB7XG4gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnk7XG4gICAgbGV0IGxvYWRRdWVyeSA9IGl0ZW0gPyB7IHBrOiBpdGVtLmlkIH0gOiB0aGlzLm1vZGVsUXVlcnk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRMb2FkKGxvYWRRdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBrIHtpbnRlZ3J9XG4gICAqIEBwYXJhbSBlbGVtIHtTZGNNb2RlbH1cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBkZWxldGUoeyBwayA9IG51bGwsIGVsZW0gPSBudWxsIH0pIHtcbiAgICBwayA9ICFlbGVtID8gcGsgOiBlbGVtLmlkO1xuICAgIGlmIChwayA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGsgb3IgZWxlbSBtdXN0IGJlIHNldFwiKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJkZWxldGVcIixcbiAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc2VydmVyLXNpZGUgcXVlcnlzZXQgZGF0YSBvdmVyIHRoZSBtb2RlbCB3ZWJzb2NrZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgKi9cbiAgX3NlbmRMb2FkKGxvYWRRdWVyeSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwibG9hZFwiLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IGxvYWRRdWVyeSA/PyB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGxpc3QtdmlldyBlbmRwb2ludCBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmRMaXN0Vmlldyh7XG4gICAgICAgICAgICAgICAgICBtb2RlbFF1ZXJ5ID0ge30sXG4gICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICAgICAgICAgfSkge1xuICAgIHJldHVybiB0aGlzLnZpZXcoe1xuICAgICAgbW9kZWxRdWVyeSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgICAgZXZlbnRUeXBlOiBcImxpc3Rfdmlld1wiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIG1vZGVsIHZpZXcgYW5kIGFwcGVuZCBpdHMgSFRNTCB0byBhIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHZpZXcoe1xuICAgICAgICAgdmlld05hbWUgPSBcImh0bWxfbGlzdF90ZW1wbGF0ZVwiLFxuICAgICAgICAgbW9kZWxRdWVyeSA9IHt9LFxuICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgZXZlbnRUeXBlID0gXCJuYW1lZF92aWV3XCIsXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICB2aWV3X25hbWU6IHZpZXdOYW1lLFxuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtb2RlbF9xdWVyeTogbW9kZWxRdWVyeSxcbiAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICRkaXZMaXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZMaXN0KTtcbiAgICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBkZXRhaWwtdmlldyBlbmRwb2ludCBmb3IgYSBzaW5nbGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmREZXRhaWxWaWV3KHtcbiAgICAgICAgICAgICAgICAgICAgcGsgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjYlJlamVjdCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgICAgICAgICAgfSkge1xuICAgIHBrID0gbm9ybWFsaXplUGsocGspO1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBcImRldGFpbF92aWV3XCIsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgdGVtcGxhdGVfY29udGV4dDogdGVtcGxhdGVDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5vcGVuUmVxdWVzdFtpZF0gPSBbXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgJGRpdkxpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgYXBwLnJlZnJlc2goJGRpdkxpc3QpO1xuICAgICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2TGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIG1vZGVsIGZvcm0gZnJhZ21lbnQgYW5kIGF0dGFjaCB0aGUgU0RDIGZvcm0gbWV0YWRhdGEgZXhwZWN0ZWQgYnlcbiAgICogdGhlIHJlc3Qgb2YgdGhlIGNsaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcGFyYW0ge1NkY01vZGVsfSBtb2RlbE9ialxuICAgKi9cbiAgZ2V0Rm9ybSh7IG1vZGVsT2JqLCBldmVudFR5cGUsIGZvcm1OYW1lLCAkZGl2Rm9ybSwgY2JSZXNvbHZlLCBjYlJlamVjdCwgZm9ybUlkIH0pIHtcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIGNvbnN0IHBrID0gbW9kZWxPYmouaWQgPz8gLTE7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgZm9ybV9uYW1lOiBmb3JtTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCB8fCBwayA9PT0gLTEgPyBcImNyZWF0ZVwiIDogXCJlZGl0XCI7XG5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtcbiAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICRkaXZGb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICBsZXQgJGZvcm0gPSAkZGl2Rm9ybVxuICAgICAgICAgIC5jbG9zZXN0KFwiZm9ybVwiKVxuICAgICAgICAgIC5hZGRDbGFzcyhcbiAgICAgICAgICAgIGBzZGMtbW9kZWwtJHtjbGFzc05hbWV9LWZvcm0gc2RjLW1vZGVsLWZvcm0gJHtmb3JtSWR9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmRhdGEoXCJtb2RlbFwiLCBtb2RlbE9iailcbiAgICAgICAgICAuZGF0YShcIm1vZGVsX3BrXCIsIHBrKVxuICAgICAgICAgIC5kYXRhKFwiZm9ybV9uYW1lXCIsIGZvcm1OYW1lKTtcbiAgICAgICAgbW9kZWxPYmouYWRkRm9ybSgkZm9ybSk7XG4gICAgICAgIGlmICgkZm9ybS5sZW5ndGggPiAwICYmICEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoXCJzZGNfc3VibWl0XCIpKSB7XG4gICAgICAgICAgJGZvcm0uYXR0cihcInNkY19zdWJtaXRcIiwgXCJzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcC5yZWZyZXNoKCRkaXZGb3JtKS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgfSxcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHNpbmdsZSBtb2RlbCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IGRvTm90TG9hZCB0cnVlIGlmIG1vZGVsUXVlcnkgY29udGFpbnMgaWQgb3IgcGsgYW5kIG9iamVjdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjTW9kZWw+fVxuICAgKi9cbiAgYXN5bmMgZ2V0KG1vZGVsUXVlcnkgPSBudWxsLCBkb05vdExvYWQgPSBmYWxzZSkge1xuICAgIGlmIChkb05vdExvYWQpIHtcbiAgICAgIGNvbnN0IGlkID0gbW9kZWxRdWVyeT8uaWQgPz8gbW9kZWxRdWVyeT8ucGs7XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKGlkKSA/PyB0aGlzLm5ldyhtb2RlbFF1ZXJ5IHx8IHRoaXMubW9kZWxRdWVyeSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZChtb2RlbFF1ZXJ5KTtcbiAgICBpZiAodGhpcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbW9kZWwgcXVlcnkgcmV0dXJucyAke3RoaXMubGVuZ3RofSBidXQgb25seSAxIGV4cGVjdGVkLmApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3RbMF07XG4gIH1cblxuICBkZXRhaWxWaWV3KHsgcGssIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kRGV0YWlsVmlldyh7XG4gICAgICBwayxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoeyBtb2RlbFF1ZXJ5ID0ge30sIHNlYXJjaFZhbHVlcyA9IHt9LCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExpc3RWaWV3KHtcbiAgICAgIG1vZGVsUXVlcnk6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubW9kZWxRdWVyeSwgbW9kZWxRdWVyeSwgeyAnX19zZWFyY2hfdmFsdWVzJzogc2VhcmNoVmFsdWVzIH0pLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICBzYXZlKHsgcGsgPSBudWxsLCBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIGNvbnN0IG5vcm1QayA9IG5vcm1hbGl6ZVBrKHBrKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgbGV0IGVsZW1MaXN0O1xuICAgICAgaWYgKG5vcm1QayA+IC0xKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmJ5SWQobm9ybVBrKTtcbiAgICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBTZGNNb2RlbEVycm9yKGBFbGVtZW50IG5vdCBmb3VuZCB3aXRoIElEOiAke25vcm1Qa31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbUxpc3QgPSBbZWxlbV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtTGlzdCA9IHRoaXMudmFsdWVzTGlzdDtcbiAgICAgIH1cbiAgICAgIGxldCBwTGlzdCA9IFtdO1xuICAgICAgZWxlbUxpc3QuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICBwTGlzdC5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzZW5kRGF0YSA9IGRhdGEgPyB7IC4uLmRhdGEgfSA6IGVsZW0uc2VyaWFsaXplKCk7XG4gICAgICAgICAgICAgIHNlbmREYXRhLnBrID0gZWxlbS5pZDtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJzYXZlXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzZW5kRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHNlbmREYXRhLnBrLFxuICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW1xuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbSB7P1NkY01vZGVsfVxuICAgKiBAcGFyYW0gZGF0YSB7P29iamVjdH1cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBjcmVhdGUoeyBlbGVtID0gbnVsbCwgZGF0YSA9IG51bGwgfSA9IHt9KSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIGVsZW0gPSB0aGlzLm5ldyhkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY3JlYXRlXCIsXG4gICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSA/PyBlbGVtPy5zZXJpYWxpemUoKSA/PyB7fSxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtpZF0gPSBbXG4gICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcmVzLmRhdGEuaW5zdGFuY2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICAgICAgZWxlbS5pZCA9IGRhdGFbMF0/LnBrIHx8IGRhdGFbMF0/LmlkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSlbMF07XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIHdlYnNvY2tldCBpcyBvcGVuIGFuZCBoYXMgY29tcGxldGVkIHRoZSBzZXJ2ZXItc2lkZSBjb25uZWN0XG4gICAqIGhhbmRzaGFrZSBiZWZvcmUgaXNzdWluZyBtb2RlbCByZXF1ZXN0cy5cbiAgICpcbiAgICogTXVsdGlwbGUgY2FsbGVycyBjYW4gYXJyaXZlIHdoaWxlIGEgY29ubmVjdGlvbiBhdHRlbXB0IGlzIGFscmVhZHkgaW5cbiAgICogcHJvZ3Jlc3MuIEluIHRoYXQgY2FzZSB0aGV5IGFyZSBxdWV1ZWQgYmVoaW5kIHRoZSBzYW1lIHN5bnRoZXRpYyByZXF1ZXN0IGlkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWQpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIXRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgfHxcbiAgICAgICAgIXRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF0gPSBbKCkgPT4ge1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH1dO1xuICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2NoZWNrQ29ubmVjdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbcmVzb2x2ZU9yaWdpbiwgcmVqZWN0T3JpZ2luXSA9XG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF0gPSBbXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZU9yaWdpbigpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0T3JpZ2luKCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGRpc2FibGUgYXV0b21hdGljIHJlY29ubmVjdCBmb3IgdGhpcyBxdWVyeXNldC5cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5fYXV0b1JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXNbXCJzb2NrZXRcIl07XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgIGVsZW0uX29uQ2xvc2UoKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhdHRhY2hlZCBgRmlsZWAgdmFsdWVzIGluIGZpeGVkLXNpemUgY2h1bmtzIGJlZm9yZSBzYXZlL2NyZWF0ZSBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHtTZGNNb2RlbH0gZWxlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICAgKi9cbiAgX3JlYWRGaWxlcyhlbGVtKSB7XG4gICAgbGV0IHRvU29sdmUgPSBbXTtcbiAgICBsZXQgZmlsZXMgPSB7fTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmlsZXMpO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhlbGVtLmNvbnN0cnVjdG9yLmZpZWxkcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVsZW1ba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgdG9Tb2x2ZS5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB2YWx1ZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICBsZXQgbnVtYmVyT2ZDaHVua3MgPSBNYXRoLmNlaWwocmVzdWx0Lmxlbmd0aCAvIE1BWF9GSUxFX1VQTE9BRCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0ge1xuICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ2h1bmtzOyArK2kpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBBcnJheS5mcm9tKHJlc3VsdC5zbGljZShcbiAgICAgICAgICAgICAgICBNQVhfRklMRV9VUExPQUQgKiBpLFxuICAgICAgICAgICAgICAgIE1BWF9GSUxFX1VQTE9BRCAqIChpICsgMSksXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF90eXBlOiBcInVwbG9hZFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgICAgICAgICAgaWR4OiBpLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfY2h1bmtzOiBudW1iZXJPZkNodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbCh0b1NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWxlcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSB3ZWJzb2NrZXQgcmVzcG9uc2VzIHRvIHRoZSBtYXRjaGluZyBwZW5kaW5nIHJlcXVlc3QgYW5kIHVwZGF0ZSBsb2NhbFxuICAgKiBzdGF0ZSB3aGVuIHRoZSBzZXJ2ZXIgc2VuZHMgbW9kZWwgcGF5bG9hZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7TWVzc2FnZUV2ZW50fSBlXG4gICAqL1xuICBhc3luYyBfb25NZXNzYWdlKGUpIHtcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgaWYgKHRoaXMub3BlblJlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShuZXcgU2RjTW9kZWxFcnJvcihkYXRhKSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hFcnJvck1zZ1wiLCBkYXRhLmhlYWRlciB8fCBcIlwiLCBkYXRhLm1zZyB8fCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdWzFdKG5ldyBTZGNNb2RlbEVycm9yKGRhdGEpKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChDT05ORUNUSU5HX1JFUVVFU1RfSUQpO1xuICAgICAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKFwicHVzaE1zZ1wiLCBkYXRhLmhlYWRlciB8fCBcIlwiLCBkYXRhLm1zZyB8fCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChDT05ORUNUSU5HX1JFUVVFU1RfSUQpO1xuICAgICAgfSBlbHNlIGlmIChbXCJsb2FkXCIsIFwibmFtZWRfdmlld1wiLCBcImRldGFpbF92aWV3XCJdLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcbiAgICAgICAgY29uc3QganNvblJlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IGF3YWl0IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25SZXMpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwib25fdXBkYXRlXCIgfHwgZGF0YS50eXBlID09PSBcIm9uX2NyZWF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICBsZXQgb2JqID0gYXdhaXQgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvblJlcyk7XG4gICAgICAgIGxldCBjYjtcblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSBcIm9uX2NyZWF0ZVwiKSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uQ3JlYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiID0gdGhpcy5vblVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNiKG9iaik7XG4gICAgICAgIGRhdGEuYXJncy5kYXRhID0gb2JqO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW5zdGFuY2UgPSBkYXRhLmRhdGE/Lmluc3RhbmNlO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuZGF0YS5pbnN0YW5jZSA9IEpTT04ucGFyc2UoZGF0YS5kYXRhLmluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3BlblJlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtkYXRhLmV2ZW50X2lkXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCB1bnRpbCBhbGwgaW4tZmxpZ2h0IHdlYnNvY2tldCByZXF1ZXN0cyBmb3IgdGhpcyBxdWVyeXNldCBhcmUgcmVzb2x2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgbm9PcGVuUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuUmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjb21wbGV0ZWQgcmVxdWVzdCBhbmQgd2FrZSBhbnkgYG5vT3BlblJlcXVlc3RzKClgIHdhaXRlcnMgd2hlbiB0aGVcbiAgICogcmVxdWVzdCBtYXAgYmVjb21lcyBlbXB0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50SWRcbiAgICovXG4gIF9jbG9zZU9wZW5SZXF1ZXN0KGV2ZW50SWQpIHtcbiAgICBkZWxldGUgdGhpcy5vcGVuUmVxdWVzdFtldmVudElkXTtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuUmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLmZvckVhY2goKHgpID0+IHgoKSk7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGlzaCB0aGUgcmF3IHdlYnNvY2tldCBjb25uZWN0aW9uIGZvciB0aGlzIHF1ZXJ5c2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIF9jb25uZWN0VG9TZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbElkZW50aWZpZXIgPVxuICAgICAgICBgJHt0aGlzLm1vZGVsTmFtZX1gICsgKHRoaXMubW9kZWxJZCA+IDAgPyBgLyR7dGhpcy5tb2RlbElkfWAgOiBcIlwiKTtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KFxuICAgICAgICAgIGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbElkZW50aWZpZXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChcbiAgICAgICAgICBgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbElkZW50aWZpZXJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBTREMgTW9kZWwgKCR7dGhpcy5tb2RlbE5hbWV9LCAke3RoaXMubW9kZWxJZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBbX2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3BlblJlcXVlc3QpKSB7XG4gICAgICAgICAgdmFsdWVbMV0oZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdCA9IHt9O1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9hdXRvUmVjb25uZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBNb2RlbCBTb2NrZXQgZW5jb3VudGVyZWQgZXJyb3I6ICR7ZXJyfSBDbG9zaW5nIHNvY2tldGApO1xuICAgICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYXBwbGljYXRpb24tbGV2ZWwgY29ubmVjdCBoYW5kc2hha2Ugb25jZSB0aGUgd2Vic29ja2V0IG9wZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICovXG4gIF9jaGVja0Nvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogXCJjb25uZWN0XCIsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgYmFja2VuZCBtb2RlbCBwYXlsb2FkIGludG8gbG9jYWxseSB0cmFja2VkIG1vZGVsIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVzdWx0c1xuICAgKi9cbiAgX3BhcnNlU2VydmVyUmVzKHJlc3VsdHMpIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBbXVxuICAgIGZvciAoY29uc3QgeCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpO1xuICAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gaXMgbm8gU2RjTW9kZWwuIG15YmUgdGhlIG1vZGVscyBhciBub3QgaW1wb3J0YWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyBNb2RlbENsYXNzKHsgJ2lkJzogeC5wayA/PyB4LmlkLCAuLi54LmZpZWxkcyB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHRoaXMuYnlJZChuZXdNb2RlbC5pZCk7XG4gICAgICBpZiAoY3VycmVudE1vZGVsKSB7XG4gICAgICAgIGN1cnJlbnRNb2RlbC5zZXRWYWx1ZXMobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChjdXJyZW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbC5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIG5ld01vZGVscy5wdXNoKG5ld01vZGVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZXNMaXN0LnNvcnQoKGEsIGIpID0+IGEuX2lkIC0gYi5faWQpO1xuICAgIHJldHVybiBuZXdNb2RlbHM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2RjTW9kZWwge1xuICBzdGF0aWMgZmllbGRzID0ge307XG5cbiAgLyoqXG4gICAqIEJhc2UgbW9kZWwgd3JhcHBlciB1c2VkIGJ5IFNEQyBtb2RlbCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbE5hbWUpIHtcbiAgICB0aGlzLl9pZCA9IG51bGw7XG4gICAgdGhpcy5fZm9ybXMgPSBbXTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybUlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3Q/fSBtb2RlbFF1ZXJ5U2V0XG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudFxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBzdGF0aWMgcXVlcnlTZXQobW9kZWxRdWVyeVNldCA9IG51bGwsIHBhcmVudCA9IG51bGwpIHtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuIG5ldyBTZGNRdWVyeVNldCh0aGlzLm1vZGVOYW1lLCBtb2RlbFF1ZXJ5U2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50LnF1ZXJ5U2V0KHRoaXMubW9kZU5hbWUsIG1vZGVsUXVlcnlTZXQpO1xuICB9XG5cbiAgYWRkRm9ybSgkZm9ybSkge1xuICAgIC8vIFJlbW92ZSBvbGQgbGlzdGVuZXJzIGlmIGZvcm0gYWxyZWFkeSBzZXRcbiAgICBjb25zdCBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9mb3Jtcy5wdXNoKCRmb3JtKTtcblxuICAgIGlmICgkZm9ybSkge1xuICAgICAgLy8gQXR0YWNoIGRlbGVnYXRlZCBldmVudCBoYW5kbGVyIHRvIGFsbCBpbnB1dHNcbiAgICAgICRmb3JtLm9uKFxuICAgICAgICBcImlucHV0LmZvcm1XYXRjaGVyIGNoYW5nZS5mb3JtV2F0Y2hlclwiLFxuICAgICAgICBcImlucHV0LCBzZWxlY3QsIHRleHRhcmVhXCIsXG4gICAgICAgIG9uQ2hhbmdlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLmZpZWxkc1tuYW1lXSkge1xuICAgICAgdGhpc1tgc2V0JHtuYW1lfWBdKGdldFZhbHVlRnJvbUZpZWxkKGV2ZW50LnRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVGb3JtKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2Zvcm1zLmZvckVhY2goKCRmb3JtKSA9PiB7XG4gICAgICAkZm9ybS5maW5kKGBbbmFtZT1cIiR7ZmllbGROYW1lfVwiXWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRWYWx1ZUluRmllbGQodGhpcywgc2VsZltmaWVsZE5hbWVdKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRWYWx1ZXMoZGF0YSA9IHt9KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VmFsdWVzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIHF1ZXJ5c2V0IHRoYXQgb3ducyB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NkY1F1ZXJ5U2V0fSBxdWVyeVNldFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG9hZGVkXG4gICAqL1xuICBfc2V0UXVlcnlTZXQocXVlcnlTZXQsIGlzTG9hZGVkKSB7XG4gICAgdGhpcy5fcXVlcnlTZXQgPSBuZXcgV2Vha1JlZihxdWVyeVNldCk7XG4gICAgdGhpcy5sb2FkZWQgPSBpc0xvYWRlZDtcbiAgfVxuXG4gIHNhdmUoeyBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnNhdmUoeyBwazogdGhpcy5pZCwgZm9ybU5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBjcmVhdGUoeyBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jcmVhdGUoeyBlbGVtOiB0aGlzLCBkYXRhIH0pO1xuICB9XG5cbiAgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRlbGV0ZSh7IGVsZW06IHRoaXMgfSk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnVwZGF0ZSh7IGl0ZW06IHRoaXMgfSk7XG4gIH1cblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgc2V0IHBrKGRhdGEpIHtcbiAgICB0aGlzLl9pZCA9IGRhdGE7XG4gIH1cblxuICBnZXQgcGsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkNsb3NlKCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuY29uc3RydWN0b3IuZmllbGRzKVxuICAgICAgLmZpbHRlcigoeCkgPT4gdGhpc1tgXyR7eH1gXSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KVxuICAgICAgLmZvckVhY2goKHgpID0+IHRoaXNbYF8ke3h9YF0uY2xvc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc2VydmVyLXJlbmRlcmVkIGRldGFpbCB2aWV3IGZvciB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRldGFpbFZpZXcoeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZXRhaWxWaWV3KHsgcGs6IHRoaXMuaWQsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCB9KTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIGlmICh2YWwubWFueV90b19tYW55IHx8IHZhbC5vbmVfdG9fbWFueSkge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsSWRzID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgICAgaWYgKGFsbElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IGFsbElkc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbC5pc19yZWxhdGlvbiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWUuaWQgPz8gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgY29uc3QgcmVzID0ge31cbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlLmlkO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgZm9yIHN5bmNpbmcgdmFsdWVzIGZyb20gYSBmb3JtIGludG8gdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGZvcm0gY29sbGVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfcmVzb2x2ZUZvcm1zKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtSWQpKSB7XG4gICAgICByZXR1cm4gJChgLiR7dGhpcy5mb3JtSWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICRmb3JtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSBjdXJyZW50IG1vZGVsIHN0YXRlIGludG8gbWF0Y2hpbmcgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqL1xuICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgJGZvcm1zID0gdGhpcy5fcmVzb2x2ZUZvcm1zKCRmb3Jtcyk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcztcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwayA9IG5vcm1hbGl6ZVBrKCQodGhpcykuZGF0YShcIm1vZGVsX3BrXCIpKTtcbiAgICAgIGlmIChzZWxmLmlkICE9PSBwaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGZvcm1JdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmb3JtSXRlbS5uYW1lO1xuICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSBcIlwiICYmICEhZmllbGRzW25hbWVdKSB7XG4gICAgICAgICAgc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCBzZWxmW25hbWVdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBtYXRjaGluZyBmb3JtIHZhbHVlcyBiYWNrIG9udG8gdGhlIGN1cnJlbnQgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEhpZGRlbiBpbnB1dHMgYXJlIHBhcnNlZCB0byB0aGVpciBvcmlnaW5hbCBwcmltaXRpdmUgdHlwZSB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgICRmb3JtcyA9IHRoaXMuX3Jlc29sdmVGb3JtcygkZm9ybXMpO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHM7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fVxuXG4gICAgZnVuY3Rpb24gc2V0VmFsdWVJbkZvcm0obmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmICghIWZpZWxkc1tuYW1lXSkge1xuICAgICAgICBzZWxmW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBrID0gbm9ybWFsaXplUGsoJCh0aGlzKS5kYXRhKFwibW9kZWxfcGtcIikpO1xuICAgICAgaWYgKHNlbGYuaWQgIT09IHBrICYmIChzZWxmLmlkICE9PSBudWxsIHx8IHBrICE9PSAtMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtSXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIHNldFZhbHVlSW5Gb3JtKGZvcm1JdGVtLm5hbWUsIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY29ycmVjdCBzZXJ2ZXItc2lkZSBmb3JtIGZvciB0aGlzIG1vZGVsIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGZvcm0oeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaWQgPT09IG51bGwgfHwgdGhpcy5pZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNyZWF0ZSBmb3JtIGZvciBhIG5ldyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfY3JlYXRlRm9ybSh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJChcIjxkaXY+XCIpO1xuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJjcmVhdGVfZm9ybVwiLFxuICAgICAgZm9ybU5hbWU6IG51bGwsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGVkaXQgZm9ybSBmb3IgYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX2VkaXRGb3JtKHsgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwiZWRpdF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIHNlcnZlci1zaWRlIGZvcm0gZm9yIHRoaXMgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgbmFtZWRGb3JtKHsgZm9ybU5hbWUsIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJuYW1lZF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZSxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgdXNpbmcgdGhlIHN1cHBsaWVkIGZpZWxkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqL1xuICB2YWxpZGF0ZSh2YWx1ZSwgY29uZmlnKSB7XG4gICAgY29uc3QgZXJyID0gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKTtcbiAgICBpZiAoZXJyKSB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgcmF3IGlucHV0IHZhbHVlIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBmaWVsZCBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHBhcnNlVmFsdWUodmFsdWUsIGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGVcbiAgICB9ID0gY29uZmlnO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiQ2hhckZpZWxkXCI6XG4gICAgICBjYXNlIFwiVGVleHRGaWVsZFwiOlxuICAgICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG5cbiAgICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJBdXRvRmllbGRcIjpcbiAgICAgIGNhc2UgXCJCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cbiAgICAgIGNhc2UgXCJGbG9hdEZpZWxkXCI6XG4gICAgICBjYXNlIFwiRGVjaW1hbEZpZWxkXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgbnVtYmVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJCb29sZWFuRmllbGRcIjpcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJEYXRlRmllbGRcIjpcbiAgICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKHZhbHVlKTtcblxuICAgICAgY2FzZSBcIlVSTEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKTtcblxuICAgICAgY2FzZSBcIkZpbGVGaWVsZFwiOlxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEZpbGVMb2FkZWQuaXNWYWxpZCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2FkZWQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxvYWRlZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxvYWRlZCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5tYXhfc2l6ZSAmJiB2YWx1ZS5zaXplID4gY29uZmlnLm1heF9zaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gYEZpbGUgdG9vIGxhcmdlIChtYXggJHtjb25maWcubWF4X3NpemV9IGJ5dGVzKWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkX3R5cGVzICYmICFjb25maWcuYWxsb3dlZF90eXBlcy5pbmNsdWRlcyh2YWx1ZS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBJbnZhbGlkIGZpbGUgdHlwZSAoJHt2YWx1ZS50eXBlfSlgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkpTT05GaWVsZFwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgYWdhaW5zdCB0aGUgZmllbGQgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZC5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gKiBAcmV0dXJucyB7P3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIG1heF9sZW5ndGg6IG1heExlbmd0aCxcbiAgICBpc19yZWxhdGlvbjogaXNSZWxhdGlvbixcbiAgICBtYW55X3RvX21hbnk6IG1hbnlUb01hbnksXG4gICAgb25lX3RvX21hbnk6IG9uZVRvTWFueSxcbiAgICBtYW55X3RvX29uZTogbWFueVRvT25lLFxuICAgIG9uZV90b19vbmU6IG9uZVRvT25lLFxuICAgIHJlbGF0ZWRfbW9kZWw6IHJlbGF0ZWRNb2RlbCxcbiAgfSA9IGNvbmZpZztcblxuICB2b2lkIGlzUmVsYXRpb247XG5cbiAgaWYgKHJlcXVpcmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIjtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG1hbnlUb01hbnkgfHwgb25lVG9NYW55IHx8IG1hbnlUb09uZSB8fCBvbmVUb09uZSkge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHx8IHZhbHVlLm1vZGVsTmFtZSAhPT0gcmVsYXRlZE1vZGVsKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIE51bWJlci5pc05hTihwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgb2JqZWN0IG9yIElEXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiQ2hhckZpZWxkXCI6XG4gICAgY2FzZSBcIlRleHRGaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgc3RyaW5nXCI7XG4gICAgICB9XG4gICAgICBpZiAobWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4gYE1heCBsZW5ndGggaXMgJHttYXhMZW5ndGh9YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkludGVnZXJGaWVsZFwiOlxuICAgIGNhc2UgXCJBdXRvRmllbGRcIjpcbiAgICBjYXNlIFwiQmlnSW50ZWdlckZpZWxkXCI6XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYW4gaW50ZWdlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgIGNhc2UgXCJEZWNpbWFsRmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIG51bWJlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQm9vbGVhbkZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgYm9vbGVhblwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRGF0ZUZpZWxkXCI6XG4gICAgY2FzZSBcIkRhdGVUaW1lRmllbGRcIjpcbiAgICAgIGlmIChpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHZhbGlkIGRhdGVcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIkludmFsaWQgZW1haWxcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlVSTEZpZWxkXCI6XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIFVSTFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVVVJREZpZWxkXCI6XG4gICAgICBpZiAoIS9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIFVVSURcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkpTT05GaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIEpTT04gb2JqZWN0XCI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiRmlsZUZpZWxkXCI6XG4gICAgICBpZiAoIUZpbGVMb2FkZWQuaXNWYWxpZCh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlTG9hZGVkKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgdmFsaWQgZmlsZVwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibmFtZXMiOlsiZ2V0VmFsdWVGcm9tRmllbGQiLCJzZXRWYWx1ZUluRmllbGQiLCJ1dWlkdjQiLCJnZXRNb2RlbCIsImFwcCIsInRyaWdnZXIiLCJNQVhfRklMRV9VUExPQUQiLCJDT05ORUNUSU5HX1JFUVVFU1RfSUQiLCJTZGNNb2RlbEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwibXNnIiwiaXNfZXJyb3IiLCJoZWFkZXIiLCJodG1sIiwiRmlsZUxvYWRlZCIsIm5hbWUiLCJ1cmwiLCJjb250ZW50IiwibG9hZCIsImZvcmNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCIkIiwiZ2V0IiwidGhlbiIsImNhdGNoIiwidGV4dCIsImlzVmFsaWQiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsIkZpbGUiLCJub3JtYWxpemVQayIsInBrIiwibm9ybWFsaXplZFBrIiwicGFyc2VJbnQiLCJOdW1iZXIiLCJpc05hTiIsIlNkY1F1ZXJ5U2V0IiwibW9kZWxOYW1lIiwibW9kZWxRdWVyeSIsInZhbHVlc0xpc3QiLCJsb2FkZWQiLCJfb25Ob09wZW5SZXF1ZXN0cyIsIl9pc0Nvbm5lY3RlZCIsIl9pc0Nvbm5lY3RpbmdQcm9jZXNzIiwiX2F1dG9SZWNvbm5lY3QiLCJzb2NrZXQiLCJvcGVuUmVxdWVzdCIsIm1vZGVsSWQiLCJvblVwZGF0ZSIsIm9uQ3JlYXRlIiwiUHJveHkiLCJ0YXJnZXQiLCJwcm9wIiwic2V0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJpZHgiLCJuZXh0IiwibGVuZ3RoIiwiZG9uZSIsIm9uX2NyZWF0ZSIsImhhbmRsZXIiLCJvbl91cGRhdGUiLCJzZXRJZHMiLCJpZHMiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJmb3JFYWNoIiwiX3NldFF1ZXJ5U2V0IiwiU2RjTW9kZWwiLCJudW1MaXN0IiwibnVtSWQiLCJOYU4iLCJpc0ludGVnZXIiLCJ0ZW1wTnVtTGlzdCIsIm1hcCIsIngiLCJzb21lIiwic3BsaXQiLCJuZXdNb2RlbCIsIm5ldyIsImlkIiwiZmlsdGVyIiwiaXRlbSIsImluY2x1ZGVzIiwidmFsdWVJZHMiLCJnZXRJZHMiLCJwdXNoIiwiYnlJZCIsIm5vcm1hbGl6ZWRJZCIsImZpbmQiLCJlbG0iLCJzZXRGaWx0ZXIiLCJhZGRGaWx0ZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJ2YWx1ZXMiLCJfc2VuZExvYWQiLCJ1cGRhdGUiLCJsb2FkUXVlcnkiLCJkZWxldGUiLCJlbGVtIiwiaXNDb25uZWN0ZWQiLCJzZW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZW50IiwiZXZlbnRfdHlwZSIsImV2ZW50X2lkIiwiYXJncyIsIm1vZGVsX25hbWUiLCJtb2RlbF9xdWVyeSIsImRhdGEiLCJfc2VuZExpc3RWaWV3IiwiY2JSZXNvbHZlIiwiY2JSZWplY3QiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ2aWV3IiwiZXZlbnRUeXBlIiwidmlld05hbWUiLCIkZGl2TGlzdCIsInZpZXdfbmFtZSIsInRlbXBsYXRlX2NvbnRleHQiLCJhcHBlbmQiLCJyZWZyZXNoIiwicmVzIiwiX3NlbmREZXRhaWxWaWV3IiwiZ2V0Rm9ybSIsIm1vZGVsT2JqIiwiZm9ybU5hbWUiLCIkZGl2Rm9ybSIsImZvcm1JZCIsImZvcm1fbmFtZSIsImNsYXNzTmFtZSIsIiRmb3JtIiwiY2xvc2VzdCIsImFkZENsYXNzIiwiYWRkRm9ybSIsImhhc0F0dHJpYnV0ZSIsImF0dHIiLCJkb05vdExvYWQiLCJkZXRhaWxWaWV3IiwibGlzdFZpZXciLCJzZWFyY2hWYWx1ZXMiLCJzYXZlIiwibm9ybVBrIiwiZWxlbUxpc3QiLCJwTGlzdCIsIl9yZWFkRmlsZXMiLCJmaWxlcyIsInNlbmREYXRhIiwic2VyaWFsaXplIiwiaW5zdGFuY2UiLCJwYXJzZSIsIl9wYXJzZVNlcnZlclJlcyIsImFsbCIsImNyZWF0ZSIsIl9jb25uZWN0VG9TZXJ2ZXIiLCJfY2hlY2tDb25uZWN0aW9uIiwicmVzb2x2ZU9yaWdpbiIsInJlamVjdE9yaWdpbiIsImNsb3NlIiwib25jbG9zZSIsIl9vbkNsb3NlIiwidG9Tb2x2ZSIsImtleXMiLCJmaWVsZHMiLCJrZXkiLCJidWZmZXIiLCJhcnJheUJ1ZmZlciIsInJlc3VsdCIsIlVpbnQ4QXJyYXkiLCJudW1iZXJPZkNodW5rcyIsIk1hdGgiLCJjZWlsIiwiZmlsZV9uYW1lIiwiZmllbGRfbmFtZSIsImNvbnRlbnRfbGVuZ3RoIiwic2l6ZSIsImkiLCJjaHVuayIsImZyb20iLCJzbGljZSIsIm51bWJlcl9vZl9jaHVua3MiLCJjb250ZW50X3R5cGUiLCJ0eXBlIiwiX29uTWVzc2FnZSIsImUiLCJoYXNPd25Qcm9wZXJ0eSIsIl9jbG9zZU9wZW5SZXF1ZXN0IiwianNvblJlcyIsIm9iaiIsImNiIiwibm9PcGVuUmVxdWVzdHMiLCJldmVudElkIiwibW9kZWxJZGVudGlmaWVyIiwid2luZG93IiwibG9jYXRpb24iLCJwcm90b2NvbCIsIldlYlNvY2tldCIsImhvc3QiLCJvbm1lc3NhZ2UiLCJiaW5kIiwiY29uc29sZSIsImVycm9yIiwiX2tleSIsImVudHJpZXMiLCJzZXRUaW1lb3V0Iiwib25lcnJvciIsImVyciIsIm9ub3BlbiIsInJlc3VsdHMiLCJuZXdNb2RlbHMiLCJNb2RlbENsYXNzIiwiY3VycmVudE1vZGVsIiwic2V0VmFsdWVzIiwic29ydCIsImEiLCJiIiwiX2lkIiwiX2Zvcm1zIiwicXVlcnlTZXQiLCJtb2RlbFF1ZXJ5U2V0IiwicGFyZW50IiwibW9kZU5hbWUiLCJvbkNoYW5nZSIsIl9vbkNoYW5nZSIsIm9uIiwiX3VwZGF0ZUZvcm0iLCJmaWVsZE5hbWUiLCJzZWxmIiwiZWFjaCIsImlzTG9hZGVkIiwiX3F1ZXJ5U2V0IiwiV2Vha1JlZiIsImRlcmVmIiwicmVkdWNlIiwiYWNjIiwidmFsIiwibWFueV90b19tYW55Iiwib25lX3RvX21hbnkiLCJhbGxJZHMiLCJpc19yZWxhdGlvbiIsInRvSnNvbiIsInN5bmNGb3JtVG9Nb2RlbCIsIiRmb3JtcyIsInN5bmNGb3JtIiwiX3Jlc29sdmVGb3JtcyIsImhhc0NsYXNzIiwic3luY01vZGVsVG9Gb3JtIiwiZm9ybUl0ZW0iLCJlbGVtZW50cyIsInJldHVyblZhbHVlIiwic2V0VmFsdWVJbkZvcm0iLCJmb3JtIiwiX2NyZWF0ZUZvcm0iLCJfZWRpdEZvcm0iLCJuYW1lZEZvcm0iLCJ2YWxpZGF0ZSIsImNvbmZpZyIsInZhbGlkYXRlRmllbGQiLCJwYXJzZVZhbHVlIiwiRGF0ZSIsIlVSTCIsIm1heF9zaXplIiwiYWxsb3dlZF90eXBlcyIsInJlcXVpcmVkIiwibWF4X2xlbmd0aCIsIm1heExlbmd0aCIsImlzUmVsYXRpb24iLCJtYW55VG9NYW55Iiwib25lVG9NYW55IiwibWFueV90b19vbmUiLCJtYW55VG9PbmUiLCJvbmVfdG9fb25lIiwib25lVG9PbmUiLCJyZWxhdGVkX21vZGVsIiwicmVsYXRlZE1vZGVsIiwidW5kZWZpbmVkIiwidGVzdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
|
|
78
78
|
|
|
79
79
|
/***/ },
|
|
80
80
|
|
|
@@ -124,7 +124,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
124
124
|
\*******************************************/
|
|
125
125
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
126
126
|
|
|
127
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ getValueFromField: () => (/* binding */ getValueFromField),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ setValueInField: () => (/* binding */ setValueInField),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ \"./src/index.js\");\n\n\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $(\"body\");\n }\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, \"\");\n var result = fnstr.slice(fnstr.indexOf(\"(\") + 1, fnstr.indexOf(\")\")).match(arg_names_reg);\n if (!result) {\n return [];\n }\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, number => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, letter => `${letter[1].toUpperCase()}`);\n return str;\n}\nfunction tagNameToReadableName(str) {\n str = str.replace(/-./g, letter => ` ${letter[1].toUpperCase()}`).replace(/^./g, letter => `${letter.toUpperCase()}`);\n return str;\n}\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(targetClass.prototype).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== \"\") {\n Object.getOwnPropertyNames(source.prototype).concat(Object.getOwnPropertySymbols(source.prototype)).forEach(prop => {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(targetClass.prototype, prop, Object.getOwnPropertyDescriptor(source.prototype, prop));\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach(mixin => {\n let newMixin;\n Object.assign(this, newMixin = new mixin());\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n static get name() {\n return baseClass.name;\n }\n static className() {\n return this.name;\n }\n get mixins() {\n return this._mixins;\n }\n }\n }[baseClass.name];\n copyProps(base, baseClass);\n mixins.forEach(mixin => {\n copyProps(base, mixin);\n });\n return base;\n}\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url,\n //Server script to process data\n type: method || \"POST\",\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener(\"progress\", progressHandlingFunction, false); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }\n });\n}\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round(e.loaded / e.total * 100);\n var $progressContainer = $(\".progress-container\");\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n percentVal += \"%\";\n $progressContainer.find(\".progress-bar\").css({\n width: percentVal\n }).text(percentVal);\n }\n}\nfunction checkIfParamNumberBoolOrString(paramElement, controller = null) {\n if (typeof paramElement !== \"string\") {\n return paramElement;\n }\n if (controller && typeof controller[paramElement] !== \"undefined\") {\n if (typeof controller[paramElement] === \"function\") {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (paramElement.match(isBoolReg)) {\n return paramElement === \"true\";\n } else if (paramElement === \"undefined\") {\n return undefined;\n } else if (paramElement.toLowerCase() === \"none\") {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n return paramElement;\n}\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n}\nfunction clearErrorsInForm($form) {\n $form.find(\".has-error\").removeClass(\"has-error\").find(\".alert-danger\").remove();\n $form.find(\".non-field-errors\").remove();\n}\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $(\"<div>\").append($resForm);\n $form.find(\".has-error\").removeClass(\"has-error\").find(\".alert-danger\").safeRemove();\n $form.find(\".non-field-errors\").safeRemove();\n let $file_container = $resForm.find(\"input[type=file]\").parent();\n $form.find(\"input[type=file]\").parent().each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n let hasNoError = $resForm.find(\".non-field-errors\").insertAfter($form.find(\".hidden-form-fields\")).length === 0;\n $resForm.find(\".has-error\").each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data(\"auto-id\");\n let $errorField = $form.find(\".form-group.\" + className);\n $errorField.addClass(\"has-error\");\n $errorField.find(\".form-input-container\").append($resErrorField.find(\".alert-danger\"));\n });\n return hasNoError;\n}\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}\n\n/**\n * Parse hidden input values back into the closest JavaScript primitive.\n *\n * Hidden inputs are often used to preserve values that were originally booleans,\n * numbers or quoted strings. This keeps form-to-model sync from turning\n * everything into plain strings.\n *\n * @param {string} value\n * @returns {*}\n */\nfunction parseHiddenInputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === \"true\";\n } else if (value === \"undefined\") {\n return undefined;\n } else if (value.toLowerCase() === \"none\") {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value, 10);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nfunction getValueFromField(formItem) {\n let {\n type,\n name\n } = formItem;\n if (name && name !== \"\") {\n if (type === \"hidden\") {\n return parseHiddenInputs($(formItem).val());\n }\n if (type === \"checkbox\") {\n return formItem.checked;\n }\n if (type === \"file\") {\n return formItem.files[0];\n }\n return $(formItem).val();\n }\n return null;\n}\nfunction setValueInField(formItem, value) {\n let {\n type,\n name\n } = formItem;\n if (name && name !== \"\") {\n if (type === \"checkbox\") {\n formItem.checked = value;\n } else if (type === \"file\") {\n if (value instanceof File) {\n if (typeof DataTransfer !== \"undefined\") {\n let container = new DataTransfer();\n container.items.add(value);\n formItem.files = container;\n }\n }\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcModel) {\n $(formItem).val(value.id);\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcQuerySet) {\n $(formItem).val(`[${value.getIds().join(',')}]`);\n } else {\n $(formItem).val(value);\n }\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzNCLElBQUkzRyxJQUFJLElBQUlBLElBQUksS0FBSyxFQUFFLEVBQUU7SUFFdkIsSUFBSTRCLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDdkIrRSxRQUFRLENBQUNFLE9BQU8sR0FBR0wsS0FBSztJQUMxQixDQUFDLE1BQU0sSUFBSTVFLElBQUksS0FBSyxNQUFNLEVBQUU7TUFDMUIsSUFBSTRFLEtBQUssWUFBWVEsSUFBSSxFQUFFO1FBQ3pCLElBQUksT0FBT0MsWUFBWSxLQUFLLFdBQVcsRUFBRTtVQUN2QyxJQUFJQyxTQUFTLEdBQUcsSUFBSUQsWUFBWSxDQUFDLENBQUM7VUFDbENDLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDQyxHQUFHLENBQUNaLEtBQUssQ0FBQztVQUMxQkcsUUFBUSxDQUFDRyxLQUFLLEdBQUdJLFNBQVM7UUFDNUI7TUFDRjtJQUNGLENBQUMsTUFBTSxJQUFJVixLQUFLLFlBQVk3SSwrQ0FBUSxFQUFFO01BQ3BDTSxDQUFDLENBQUMwSSxRQUFRLENBQUMsQ0FBQ0MsR0FBRyxDQUFDSixLQUFLLENBQUNhLEVBQUUsQ0FBQztJQUMzQixDQUFDLE1BQU0sSUFBSWIsS0FBSyxZQUFZNUksa0RBQVcsRUFBRTtNQUN2Q0ssQ0FBQyxDQUFDMEksUUFBUSxDQUFDLENBQUNDLEdBQUcsQ0FBQyxJQUFJSixLQUFLLENBQUNjLE1BQU0sQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ2xELENBQUMsTUFBTTtNQUNMdEosQ0FBQyxDQUFDMEksUUFBUSxDQUFDLENBQUNDLEdBQUcsQ0FBQ0osS0FBSyxDQUFDO0lBQ3hCO0VBQ0Y7RUFDQSxPQUFPLElBQUk7QUFDYiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdXRpbHMuanM/ZDBlMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NkY01vZGVsLCBTZGNRdWVyeVNldH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIHRoZSBIVE1MIGJvZHkuXG4gKiBAdHlwZSB7KnxqUXVlcnl8SFRNTEVsZW1lbnR9XG4gKiBAcHJpdmF0ZVxuICovXG5sZXQgXyRib2R5O1xuY29uc3QgYXJnX25hbWVzX3JlZyA9IC8oPzw9XnwsXFxzPylbXj1cXHMsXSsvZztcbmNvbnN0IGNvbW1lbmRfcmVnID0gLygoXFwvXFwvLiokKXwoXFwvXFwqW1xcc1xcU10qP1xcKlxcLykpL2dtO1xuXG4vKipcbiAqIGdldEJvZHkgcmV0dXJucyB0aGUgJGJvZHkgalF1ZXJ5IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7KnxqUXVlcnl8SFRNTEVsZW1lbnR9IC0gYm9keSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb2R5KCkge1xuICBpZiAoIV8kYm9keSkge1xuICAgIF8kYm9keSA9ICQoXCJib2R5XCIpO1xuICB9XG5cbiAgcmV0dXJuIF8kYm9keTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuY1xuICogQHJldHVybnMge1JlZ0V4cE1hdGNoQXJyYXl8KltdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyYW1zTmFtZU9mRnVuY3Rpb24oZnVuYykge1xuICB2YXIgZm5zdHIgPSBmdW5jLnRvU3RyaW5nKCkucmVwbGFjZShjb21tZW5kX3JlZywgXCJcIik7XG4gIHZhciByZXN1bHQgPSBmbnN0clxuICAgIC5zbGljZShmbnN0ci5pbmRleE9mKFwiKFwiKSArIDEsIGZuc3RyLmluZGV4T2YoXCIpXCIpKVxuICAgIC5tYXRjaChhcmdfbmFtZXNfcmVnKTtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIHByb21pc2VEdW1teUZhY3RvcnkgZ2VuZXJhdGVzIGEgc2ltcGxlIHByb21pc2Ugd2hpY2ggcmV0dXJucyBpbnN0YW50bHkuXG4gKiBAcmV0dXJuIHtQcm9taXNlfSB3aW5kb3cudXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VEdW1teUZhY3RvcnkoKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHJlc29sdmUoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2VUb1RhZ05hbWUoc3RyKSB7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgLSR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YCk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9bMC05XSsvZywgKG51bWJlcikgPT4gYC0ke251bWJlcn1gKTtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eWy1dL2csIGBgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhZ05hbWVUb0NhbWVsQ2FzZShzdHIpIHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoLy0uL2csIChsZXR0ZXIpID0+IGAke2xldHRlclsxXS50b1VwcGVyQ2FzZSgpfWApO1xuICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvUmVhZGFibGVOYW1lKHN0cikge1xuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvLS4vZywgKGxldHRlcikgPT4gYCAke2xldHRlclsxXS50b1VwcGVyQ2FzZSgpfWApXG4gICAgLnJlcGxhY2UoL14uL2csIChsZXR0ZXIpID0+IGAke2xldHRlci50b1VwcGVyQ2FzZSgpfWApO1xuICByZXR1cm4gc3RyO1xufVxuXG5jb25zdCBjb3B5UHJvcHMgPSAodGFyZ2V0Q2xhc3MsIHNvdXJjZUNsYXNzKSA9PiB7XG4gIGxldCBzb3VyY2UgPSBzb3VyY2VDbGFzcztcbiAgbGV0IHByb3BOYW1lc1RhcmdldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFxuICAgIHRhcmdldENsYXNzLnByb3RvdHlwZSxcbiAgKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXRDbGFzcy5wcm90b3R5cGUpKTtcbiAgd2hpbGUgKHNvdXJjZS5uYW1lICE9PSBcIlwiKSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlLnByb3RvdHlwZSlcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UucHJvdG90eXBlKSlcbiAgICAgIC5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wLm1hdGNoKFxuICAgICAgICAgICAgL14oPzpjb25zdHJ1Y3Rvcnxwcm90b3R5cGV8YXJndW1lbnRzfGNhbGxlcnxuYW1lfGJpbmR8Y2FsbHxhcHBseXx0b1N0cmluZ3xsZW5ndGgpJC8sXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb3BOYW1lc1RhcmdldC5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgIHByb3BOYW1lc1RhcmdldC5wdXNoKHByb3ApO1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgIHRhcmdldENsYXNzLnByb3RvdHlwZSxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZS5wcm90b3R5cGUsIHByb3ApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHNvdXJjZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpO1xuICB9XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBBYnN0cmFjdFNEQ30gYmFzZUNsYXNzXG4gKiBAcGFyYW0ge3R5cGVvZiBBYnN0cmFjdFNEQ30gbWl4aW5zXG4gKiBAcmV0dXJucyB7dHlwZW9mIEFic3RyYWN0U0RDfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWdpbGVBZ2dyZWdhdGlvbihiYXNlQ2xhc3MsIC4uLm1peGlucykge1xuICBsZXQgYmFzZSA9IHtcbiAgICBbYmFzZUNsYXNzLm5hbWVdOiBjbGFzcyB7XG4gICAgICBjb25zdHJ1Y3RvciguLi5fYXJncykge1xuICAgICAgICBsZXQgX21peGlucyA9IHt9O1xuICAgICAgICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICAgICAgICBsZXQgbmV3TWl4aW47XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCAobmV3TWl4aW4gPSBuZXcgbWl4aW4oKSkpO1xuICAgICAgICAgIG5ld01peGluLl90YWdOYW1lID0gbWl4aW4ucHJvdG90eXBlLl90YWdOYW1lO1xuICAgICAgICAgIG5ld01peGluLl9pc01peGluID0gdHJ1ZTtcbiAgICAgICAgICBfbWl4aW5zW21peGluLm5hbWVdID0gbmV3TWl4aW47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgbmV3IGJhc2VDbGFzcygpKTtcbiAgICAgICAgdGhpcy5fbWl4aW5zID0gX21peGlucztcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gYmFzZUNsYXNzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHN0YXRpYyBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGdldCBtaXhpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taXhpbnM7XG4gICAgICB9XG4gICAgfSxcbiAgfVtiYXNlQ2xhc3MubmFtZV07XG5cbiAgY29weVByb3BzKGJhc2UsIGJhc2VDbGFzcyk7XG5cbiAgbWl4aW5zLmZvckVhY2goKG1peGluKSA9PiB7XG4gICAgY29weVByb3BzKGJhc2UsIG1peGluKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGNzcmZTYWZlTWV0aG9kKG1ldGhvZCkge1xuICAvLyB0aGVzZSBIVFRQIG1ldGhvZHMgZG8gbm90IHJlcXVpcmUgQ1NSRiBwcm90ZWN0aW9uXG4gIHJldHVybiAvXihHRVR8SEVBRHxPUFRJT05TfFRSQUNFKSQvLnRlc3QobWV0aG9kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsLCBtZXRob2QpIHtcbiAgcmV0dXJuICQuYWpheCh7XG4gICAgdXJsOiB1cmwsIC8vU2VydmVyIHNjcmlwdCB0byBwcm9jZXNzIGRhdGFcbiAgICB0eXBlOiBtZXRob2QgfHwgXCJQT1NUXCIsXG4gICAgeGhyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDdXN0b20gWE1MSHR0cFJlcXVlc3RcbiAgICAgIHZhciBteVhociA9ICQuYWpheFNldHRpbmdzLnhocigpO1xuICAgICAgaWYgKG15WGhyLnVwbG9hZCkge1xuICAgICAgICAvLyBDaGVjayBpZiB1cGxvYWQgcHJvcGVydHkgZXhpc3RzXG4gICAgICAgIG15WGhyLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwicHJvZ3Jlc3NcIixcbiAgICAgICAgICBwcm9ncmVzc0hhbmRsaW5nRnVuY3Rpb24sXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7IC8vIEZvciBoYW5kbGluZyB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHVwbG9hZFxuICAgICAgfVxuICAgICAgcmV0dXJuIG15WGhyO1xuICAgIH0sXG4gICAgLy9Gb3JtIGRhdGFcbiAgICBkYXRhOiBmb3JtRGF0YSxcbiAgICAvL09wdGlvbnMgdG8gdGVsbCBqUXVlcnkgbm90IHRvIHByb2Nlc3MgZGF0YSBvciB3b3JyeSBhYm91dCBjb250ZW50LXR5cGUuXG4gICAgY2FjaGU6IGZhbHNlLFxuICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKHhociwgc2V0dGluZ3MpIHtcbiAgICAgIGlmICghY3NyZlNhZmVNZXRob2Qoc2V0dGluZ3MudHlwZSkgJiYgIXRoaXMuY3Jvc3NEb21haW4pIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUNTUkZUb2tlblwiLCB3aW5kb3cuQ1NSRl9UT0tFTik7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbihlKSB7XG4gIGlmIChlLmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICB2YXIgcGVyY2VudFZhbCA9IE1hdGgucm91bmQoKGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDApO1xuICAgIHZhciAkcHJvZ3Jlc3NDb250YWluZXIgPSAkKFwiLnByb2dyZXNzLWNvbnRhaW5lclwiKTtcbiAgICBpZiAocGVyY2VudFZhbCA9PT0gMTAwKSB7XG4gICAgICAkcHJvZ3Jlc3NDb250YWluZXIuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkcHJvZ3Jlc3NDb250YWluZXIuc2hvdygpO1xuICAgIH1cblxuICAgIHBlcmNlbnRWYWwgKz0gXCIlXCI7XG5cbiAgICAkcHJvZ3Jlc3NDb250YWluZXJcbiAgICAgIC5maW5kKFwiLnByb2dyZXNzLWJhclwiKVxuICAgICAgLmNzcyh7d2lkdGg6IHBlcmNlbnRWYWx9KVxuICAgICAgLnRleHQocGVyY2VudFZhbCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyhcbiAgcGFyYW1FbGVtZW50LFxuICBjb250cm9sbGVyID0gbnVsbCxcbikge1xuICBpZiAodHlwZW9mIHBhcmFtRWxlbWVudCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBwYXJhbUVsZW1lbnQ7XG4gIH1cblxuICBpZiAoY29udHJvbGxlciAmJiB0eXBlb2YgY29udHJvbGxlcltwYXJhbUVsZW1lbnRdICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaWYgKHR5cGVvZiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XS5iaW5kKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlcltwYXJhbUVsZW1lbnRdO1xuICB9XG5cbiAgbGV0IGlzRmxvYXRSZWcgPSAvXi0/XFxkK1xcLj9cXGQrJC87XG4gIGxldCBpc0ludFJlZyA9IC9eLT9cXGQrJC87XG4gIGxldCBpc0Jvb2xSZWcgPSAvXih0cnVlfGZhbHNlKSQvO1xuICBsZXQgaXNTdHJpbmdSZWcgPSAvXihbJ11bXiddKlsnXSl8KFtcIl1bXlwiXSpbXCJdKSQvO1xuXG4gIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNCb29sUmVnKSkge1xuICAgIHJldHVybiBwYXJhbUVsZW1lbnQgPT09IFwidHJ1ZVwiO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50LnRvTG93ZXJDYXNlKCkgPT09IFwibm9uZVwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzSW50UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUludChwYXJhbUVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHBhcmFtRWxlbWVudCk7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgIHJldHVybiBwYXJhbUVsZW1lbnQuc3Vic3RyKDEsIHBhcmFtRWxlbWVudC5sZW5ndGggLSAyKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbUVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7XG4gIHJldHVybiAoWzFlN10gKyAtMWUzICsgLTRlMyArIC04ZTMgKyAtMWUxMSkucmVwbGFjZSgvWzAxOF0vZywgKGMpID0+XG4gICAgKFxuICAgICAgYyBeXG4gICAgICAoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAoMTUgPj4gKGMgLyA0KSkpXG4gICAgKS50b1N0cmluZygxNiksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVycm9yc0luRm9ybSgkZm9ybSkge1xuICAkZm9ybVxuICAgIC5maW5kKFwiLmhhcy1lcnJvclwiKVxuICAgIC5yZW1vdmVDbGFzcyhcImhhcy1lcnJvclwiKVxuICAgIC5maW5kKFwiLmFsZXJ0LWRhbmdlclwiKVxuICAgIC5yZW1vdmUoKTtcbiAgJGZvcm0uZmluZChcIi5ub24tZmllbGQtZXJyb3JzXCIpLnJlbW92ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXJyb3JzSW5Gb3JtKCRmb3JtLCAkcmVzRm9ybSkge1xuICAkcmVzRm9ybSA9ICQoXCI8ZGl2PlwiKS5hcHBlbmQoJHJlc0Zvcm0pO1xuXG4gICRmb3JtXG4gICAgLmZpbmQoXCIuaGFzLWVycm9yXCIpXG4gICAgLnJlbW92ZUNsYXNzKFwiaGFzLWVycm9yXCIpXG4gICAgLmZpbmQoXCIuYWxlcnQtZGFuZ2VyXCIpXG4gICAgLnNhZmVSZW1vdmUoKTtcbiAgJGZvcm0uZmluZChcIi5ub24tZmllbGQtZXJyb3JzXCIpLnNhZmVSZW1vdmUoKTtcbiAgbGV0ICRmaWxlX2NvbnRhaW5lciA9ICRyZXNGb3JtLmZpbmQoXCJpbnB1dFt0eXBlPWZpbGVdXCIpLnBhcmVudCgpO1xuICAkZm9ybVxuICAgIC5maW5kKFwiaW5wdXRbdHlwZT1maWxlXVwiKVxuICAgIC5wYXJlbnQoKVxuICAgIC5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgJCh0aGlzKS5yZXBsYWNlV2l0aCgkZmlsZV9jb250YWluZXJbaW5kZXhdKTtcbiAgICB9KTtcblxuICBsZXQgaGFzTm9FcnJvciA9XG4gICAgJHJlc0Zvcm1cbiAgICAgIC5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIilcbiAgICAgIC5pbnNlcnRBZnRlcigkZm9ybS5maW5kKFwiLmhpZGRlbi1mb3JtLWZpZWxkc1wiKSkubGVuZ3RoID09PSAwO1xuICAkcmVzRm9ybS5maW5kKFwiLmhhcy1lcnJvclwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBoYXNOb0Vycm9yID0gZmFsc2U7XG4gICAgbGV0ICRyZXNFcnJvckZpZWxkID0gJCh0aGlzKTtcbiAgICBsZXQgY2xhc3NOYW1lID0gJHJlc0Vycm9yRmllbGQuZGF0YShcImF1dG8taWRcIik7XG4gICAgbGV0ICRlcnJvckZpZWxkID0gJGZvcm0uZmluZChcIi5mb3JtLWdyb3VwLlwiICsgY2xhc3NOYW1lKTtcbiAgICAkZXJyb3JGaWVsZC5hZGRDbGFzcyhcImhhcy1lcnJvclwiKTtcbiAgICAkZXJyb3JGaWVsZFxuICAgICAgLmZpbmQoXCIuZm9ybS1pbnB1dC1jb250YWluZXJcIilcbiAgICAgIC5hcHBlbmQoJHJlc0Vycm9yRmllbGQuZmluZChcIi5hbGVydC1kYW5nZXJcIikpO1xuICB9KTtcblxuICByZXR1cm4gaGFzTm9FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpxdWVyeUluc2VydEF0KCRjb250YWluZXIsIGluZGV4LCAkbmV3RWxlbWVudCkge1xuICBsZXQgbGFzdEluZGV4ID0gJGNvbnRhaW5lci5jaGlsZHJlbigpLnNpemUoKTtcbiAgaWYgKGluZGV4IDwgbGFzdEluZGV4KSB7XG4gICAgJGNvbnRhaW5lci5jaGlsZHJlbigpLmVxKGluZGV4KS5iZWZvcmUoJG5ld0VsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgICRjb250YWluZXIuYXBwZW5kKCRuZXdFbGVtZW50KTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBQYXJzZSBoaWRkZW4gaW5wdXQgdmFsdWVzIGJhY2sgaW50byB0aGUgY2xvc2VzdCBKYXZhU2NyaXB0IHByaW1pdGl2ZS5cbiAqXG4gKiBIaWRkZW4gaW5wdXRzIGFyZSBvZnRlbiB1c2VkIHRvIHByZXNlcnZlIHZhbHVlcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBib29sZWFucyxcbiAqIG51bWJlcnMgb3IgcXVvdGVkIHN0cmluZ3MuIFRoaXMga2VlcHMgZm9ybS10by1tb2RlbCBzeW5jIGZyb20gdHVybmluZ1xuICogZXZlcnl0aGluZyBpbnRvIHBsYWluIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VIaWRkZW5JbnB1dHModmFsdWUpIHtcbiAgbGV0IGlzRmxvYXRSZWcgPSAvXi0/XFxkK1xcLj9cXGQrJC87XG4gIGxldCBpc0ludFJlZyA9IC9eLT9cXGQrJC87XG4gIGxldCBpc0Jvb2xSZWcgPSAvXih0cnVlfGZhbHNlKSQvO1xuICBsZXQgaXNTdHJpbmdSZWcgPSAvXihbJ11bXiddKlsnXSl8KFtcIl1bXlwiXSpbXCJdKSQvO1xuXG4gIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKGlzQm9vbFJlZykpIHtcbiAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwibm9uZVwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNJbnRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZyb21GaWVsZChmb3JtSXRlbSkge1xuICBsZXQge3R5cGUsIG5hbWV9ID0gZm9ybUl0ZW07XG4gIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIpIHtcbiAgICBpZiAodHlwZSA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgcmV0dXJuIHBhcnNlSGlkZGVuSW5wdXRzKCQoZm9ybUl0ZW0pLnZhbCgpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICByZXR1cm4gZm9ybUl0ZW0uY2hlY2tlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbS5maWxlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gJChmb3JtSXRlbSkudmFsKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlSW5GaWVsZChmb3JtSXRlbSwgdmFsdWUpIHtcbiAgbGV0IHt0eXBlLCBuYW1lfSA9IGZvcm1JdGVtO1xuICBpZiAobmFtZSAmJiBuYW1lICE9PSBcIlwiKSB7XG5cbiAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICBmb3JtSXRlbS5jaGVja2VkID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBpZiAodHlwZW9mIERhdGFUcmFuc2ZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgY29udGFpbmVyLml0ZW1zLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgZm9ybUl0ZW0uZmlsZXMgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjTW9kZWwpIHtcbiAgICAgICQoZm9ybUl0ZW0pLnZhbCh2YWx1ZS5pZCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAkKGZvcm1JdGVtKS52YWwoYFske3ZhbHVlLmdldElkcygpLmpvaW4oJywnKX1dYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoZm9ybUl0ZW0pLnZhbCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbIlNkY01vZGVsIiwiU2RjUXVlcnlTZXQiLCJfJGJvZHkiLCJhcmdfbmFtZXNfcmVnIiwiY29tbWVuZF9yZWciLCJnZXRCb2R5IiwiJCIsImdldFBhcmFtc05hbWVPZkZ1bmN0aW9uIiwiZnVuYyIsImZuc3RyIiwidG9TdHJpbmciLCJyZXBsYWNlIiwicmVzdWx0Iiwic2xpY2UiLCJpbmRleE9mIiwibWF0Y2giLCJwcm9taXNlRHVtbXlGYWN0b3J5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYW1lbENhc2VUb1RhZ05hbWUiLCJzdHIiLCJsZXR0ZXIiLCJ0b0xvd2VyQ2FzZSIsIm51bWJlciIsInRhZ05hbWVUb0NhbWVsQ2FzZSIsInRvVXBwZXJDYXNlIiwidGFnTmFtZVRvUmVhZGFibGVOYW1lIiwiY29weVByb3BzIiwidGFyZ2V0Q2xhc3MiLCJzb3VyY2VDbGFzcyIsInNvdXJjZSIsInByb3BOYW1lc1RhcmdldCIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJjb25jYXQiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJuYW1lIiwiZm9yRWFjaCIsInByb3AiLCJpbmNsdWRlcyIsInB1c2giLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldFByb3RvdHlwZU9mIiwiYWdpbGVBZ2dyZWdhdGlvbiIsImJhc2VDbGFzcyIsIm1peGlucyIsImJhc2UiLCJjb25zdHJ1Y3RvciIsIl9hcmdzIiwiX21peGlucyIsIm1peGluIiwibmV3TWl4aW4iLCJhc3NpZ24iLCJfdGFnTmFtZSIsIl9pc01peGluIiwiY2xhc3NOYW1lIiwiY3NyZlNhZmVNZXRob2QiLCJtZXRob2QiLCJ0ZXN0IiwidXBsb2FkRmlsZUZvcm1EYXRhIiwiZm9ybURhdGEiLCJ1cmwiLCJhamF4IiwidHlwZSIsInhociIsIm15WGhyIiwiYWpheFNldHRpbmdzIiwidXBsb2FkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbiIsImRhdGEiLCJjYWNoZSIsImNvbnRlbnRUeXBlIiwicHJvY2Vzc0RhdGEiLCJiZWZvcmVTZW5kIiwic2V0dGluZ3MiLCJjcm9zc0RvbWFpbiIsInNldFJlcXVlc3RIZWFkZXIiLCJ3aW5kb3ciLCJDU1JGX1RPS0VOIiwiZSIsImxlbmd0aENvbXB1dGFibGUiLCJwZXJjZW50VmFsIiwiTWF0aCIsInJvdW5kIiwibG9hZGVkIiwidG90YWwiLCIkcHJvZ3Jlc3NDb250YWluZXIiLCJoaWRlIiwic2hvdyIsImZpbmQiLCJjc3MiLCJ3aWR0aCIsInRleHQiLCJjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmciLCJwYXJhbUVsZW1lbnQiLCJjb250cm9sbGVyIiwiYmluZCIsImlzRmxvYXRSZWciLCJpc0ludFJlZyIsImlzQm9vbFJlZyIsImlzU3RyaW5nUmVnIiwidW5kZWZpbmVkIiwicGFyc2VJbnQiLCJwYXJzZUZsb2F0Iiwic3Vic3RyIiwibGVuZ3RoIiwidXVpZHY0IiwiYyIsImNyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsIlVpbnQ4QXJyYXkiLCJjbGVhckVycm9yc0luRm9ybSIsIiRmb3JtIiwicmVtb3ZlQ2xhc3MiLCJyZW1vdmUiLCJzZXRFcnJvcnNJbkZvcm0iLCIkcmVzRm9ybSIsImFwcGVuZCIsInNhZmVSZW1vdmUiLCIkZmlsZV9jb250YWluZXIiLCJwYXJlbnQiLCJlYWNoIiwiaW5kZXgiLCJyZXBsYWNlV2l0aCIsImhhc05vRXJyb3IiLCJpbnNlcnRBZnRlciIsIiRyZXNFcnJvckZpZWxkIiwiJGVycm9yRmllbGQiLCJhZGRDbGFzcyIsImpxdWVyeUluc2VydEF0IiwiJGNvbnRhaW5lciIsIiRuZXdFbGVtZW50IiwibGFzdEluZGV4IiwiY2hpbGRyZW4iLCJzaXplIiwiZXEiLCJiZWZvcmUiLCJwYXJzZUhpZGRlbklucHV0cyIsInZhbHVlIiwic3Vic3RyaW5nIiwiZ2V0VmFsdWVGcm9tRmllbGQiLCJmb3JtSXRlbSIsInZhbCIsImNoZWNrZWQiLCJmaWxlcyIsInNldFZhbHVlSW5GaWVsZCIsIkZpbGUiLCJEYXRhVHJhbnNmZXIiLCJjb250YWluZXIiLCJpdGVtcyIsImFkZCIsImlkIiwiZ2V0SWRzIiwiam9pbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
|
|
127
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ getValueFromField: () => (/* binding */ getValueFromField),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ setValueInField: () => (/* binding */ setValueInField),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ \"./src/index.js\");\n\n\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $(\"body\");\n }\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, \"\");\n var result = fnstr.slice(fnstr.indexOf(\"(\") + 1, fnstr.indexOf(\")\")).match(arg_names_reg);\n if (!result) {\n return [];\n }\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, number => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, letter => `${letter[1].toUpperCase()}`);\n return str;\n}\nfunction tagNameToReadableName(str) {\n str = str.replace(/-./g, letter => ` ${letter[1].toUpperCase()}`).replace(/^./g, letter => `${letter.toUpperCase()}`);\n return str;\n}\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(targetClass.prototype).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== \"\") {\n Object.getOwnPropertyNames(source.prototype).concat(Object.getOwnPropertySymbols(source.prototype)).forEach(prop => {\n if (prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n return;\n }\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(targetClass.prototype, prop, Object.getOwnPropertyDescriptor(source.prototype, prop));\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach(mixin => {\n let newMixin;\n Object.assign(this, newMixin = new mixin());\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n static get name() {\n return baseClass.name;\n }\n static className() {\n return this.name;\n }\n get mixins() {\n return this._mixins;\n }\n }\n }[baseClass.name];\n copyProps(base, baseClass);\n mixins.forEach(mixin => {\n copyProps(base, mixin);\n });\n return base;\n}\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url,\n //Server script to process data\n type: method || \"POST\",\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener(\"progress\", progressHandlingFunction, false); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n }\n });\n}\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round(e.loaded / e.total * 100);\n var $progressContainer = $(\".progress-container\");\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n percentVal += \"%\";\n $progressContainer.find(\".progress-bar\").css({\n width: percentVal\n }).text(percentVal);\n }\n}\nfunction checkIfParamNumberBoolOrString(paramElement, controller = null) {\n if (typeof paramElement !== \"string\") {\n return paramElement;\n }\n if (controller && typeof controller[paramElement] !== \"undefined\") {\n if (typeof controller[paramElement] === \"function\") {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (paramElement.match(isBoolReg)) {\n return paramElement === \"true\";\n } else if (paramElement === \"undefined\") {\n return undefined;\n } else if (paramElement.toLowerCase() === \"none\") {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n return paramElement;\n}\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n}\nfunction clearErrorsInForm($form) {\n $form.find(\".has-error\").removeClass(\"has-error\").find(\".alert-danger\").remove();\n $form.find(\".non-field-errors\").remove();\n}\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $(\"<div>\").append($resForm);\n $form.find(\".has-error\").removeClass(\"has-error\").find(\".alert-danger\").safeRemove();\n $form.find(\".non-field-errors\").safeRemove();\n let $file_container = $resForm.find(\"input[type=file]\").parent();\n $form.find(\"input[type=file]\").parent().each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n let hasNoError = $resForm.find(\".non-field-errors\").insertAfter($form.find(\".hidden-form-fields\")).length === 0;\n $resForm.find(\".has-error\").each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data(\"auto-id\");\n let $errorField = $form.find(\".form-group.\" + className);\n $errorField.addClass(\"has-error\");\n $errorField.find(\".form-input-container\").append($resErrorField.find(\".alert-danger\"));\n });\n return hasNoError;\n}\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}\n\n/**\n * Parse hidden input values back into the closest JavaScript primitive.\n *\n * Hidden inputs are often used to preserve values that were originally booleans,\n * numbers or quoted strings. This keeps form-to-model sync from turning\n * everything into plain strings.\n *\n * @param {string} value\n * @returns {*}\n */\nfunction parseHiddenInputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === \"true\";\n } else if (value === \"undefined\") {\n return undefined;\n } else if (value.toLowerCase() === \"none\") {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value, 10);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nfunction getValueFromField(formItem) {\n let {\n type,\n name\n } = formItem;\n if (name && name !== \"\") {\n if (type === \"hidden\") {\n return parseHiddenInputs($(formItem).val());\n }\n if (type === \"checkbox\") {\n return formItem.checked;\n }\n if (type === \"file\") {\n return formItem.files[0];\n }\n return $(formItem).val();\n }\n return null;\n}\nfunction setValueInField(formItem, value) {\n let {\n type,\n name\n } = formItem;\n if (name && name !== \"\") {\n if (type === \"checkbox\") {\n formItem.checked = !!value;\n } else if (type === \"file\") {\n if (value instanceof File) {\n if (typeof DataTransfer !== \"undefined\") {\n let container = new DataTransfer();\n container.items.add(value);\n formItem.files = container;\n }\n }\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcModel) {\n $(formItem).val(value.id);\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcQuerySet) {\n $(formItem).val(`[${value.getIds().join(',')}]`);\n } else {\n if (value === null) {\n value = \"\";\n }\n $(formItem).val(value);\n }\n }\n return null;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzNCLElBQUkzRyxJQUFJLElBQUlBLElBQUksS0FBSyxFQUFFLEVBQUU7SUFFdkIsSUFBSTRCLElBQUksS0FBSyxVQUFVLEVBQUU7TUFDdkIrRSxRQUFRLENBQUNFLE9BQU8sR0FBRyxDQUFDLENBQUNMLEtBQUs7SUFDNUIsQ0FBQyxNQUFNLElBQUk1RSxJQUFJLEtBQUssTUFBTSxFQUFFO01BQzFCLElBQUk0RSxLQUFLLFlBQVlRLElBQUksRUFBRTtRQUN6QixJQUFJLE9BQU9DLFlBQVksS0FBSyxXQUFXLEVBQUU7VUFDdkMsSUFBSUMsU0FBUyxHQUFHLElBQUlELFlBQVksQ0FBQyxDQUFDO1VBQ2xDQyxTQUFTLENBQUNDLEtBQUssQ0FBQ0MsR0FBRyxDQUFDWixLQUFLLENBQUM7VUFDMUJHLFFBQVEsQ0FBQ0csS0FBSyxHQUFHSSxTQUFTO1FBQzVCO01BQ0Y7SUFDRixDQUFDLE1BQU0sSUFBSVYsS0FBSyxZQUFZN0ksK0NBQVEsRUFBRTtNQUNwQ00sQ0FBQyxDQUFDMEksUUFBUSxDQUFDLENBQUNDLEdBQUcsQ0FBQ0osS0FBSyxDQUFDYSxFQUFFLENBQUM7SUFDM0IsQ0FBQyxNQUFNLElBQUliLEtBQUssWUFBWTVJLGtEQUFXLEVBQUU7TUFDdkNLLENBQUMsQ0FBQzBJLFFBQVEsQ0FBQyxDQUFDQyxHQUFHLENBQUMsSUFBSUosS0FBSyxDQUFDYyxNQUFNLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxDQUFDLE1BQU07TUFDTCxJQUFJZixLQUFLLEtBQUssSUFBSSxFQUFFO1FBQ2xCQSxLQUFLLEdBQUcsRUFBRTtNQUNaO01BQ0F2SSxDQUFDLENBQUMwSSxRQUFRLENBQUMsQ0FBQ0MsR0FBRyxDQUFDSixLQUFLLENBQUM7SUFDeEI7RUFDRjtFQUNBLE9BQU8sSUFBSTtBQUNiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY191dGlscy5qcz9kMGUzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2RjTW9kZWwsIFNkY1F1ZXJ5U2V0fSBmcm9tIFwiLi4vaW5kZXguanNcIjtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIEhUTUwgYm9keS5cbiAqIEB0eXBlIHsqfGpRdWVyeXxIVE1MRWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmxldCBfJGJvZHk7XG5jb25zdCBhcmdfbmFtZXNfcmVnID0gLyg/PD1efCxcXHM/KVtePVxccyxdKy9nO1xuY29uc3QgY29tbWVuZF9yZWcgPSAvKChcXC9cXC8uKiQpfChcXC9cXCpbXFxzXFxTXSo/XFwqXFwvKSkvZ207XG5cbi8qKlxuICogZ2V0Qm9keSByZXR1cm5zIHRoZSAkYm9keSBqUXVlcnkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHsqfGpRdWVyeXxIVE1MRWxlbWVudH0gLSBib2R5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gIGlmICghXyRib2R5KSB7XG4gICAgXyRib2R5ID0gJChcImJvZHlcIik7XG4gIH1cblxuICByZXR1cm4gXyRib2R5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gKiBAcmV0dXJucyB7UmVnRXhwTWF0Y2hBcnJheXwqW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihmdW5jKSB7XG4gIHZhciBmbnN0ciA9IGZ1bmMudG9TdHJpbmcoKS5yZXBsYWNlKGNvbW1lbmRfcmVnLCBcIlwiKTtcbiAgdmFyIHJlc3VsdCA9IGZuc3RyXG4gICAgLnNsaWNlKGZuc3RyLmluZGV4T2YoXCIoXCIpICsgMSwgZm5zdHIuaW5kZXhPZihcIilcIikpXG4gICAgLm1hdGNoKGFyZ19uYW1lc19yZWcpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogcHJvbWlzZUR1bW15RmFjdG9yeSBnZW5lcmF0ZXMgYSBzaW1wbGUgcHJvbWlzZSB3aGljaCByZXR1cm5zIGluc3RhbnRseS5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHdpbmRvdy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUR1bW15RmFjdG9yeSgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsQ2FzZVRvVGFnTmFtZShzdHIpIHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1tBLVpdL2csIChsZXR0ZXIpID0+IGAtJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1swLTldKy9nLCAobnVtYmVyKSA9PiBgLSR7bnVtYmVyfWApO1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bLV0vZywgYGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvQ2FtZWxDYXNlKHN0cikge1xuICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUoc3RyKSB7XG4gIHN0ciA9IHN0clxuICAgIC5yZXBsYWNlKC8tLi9nLCAobGV0dGVyKSA9PiBgICR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YClcbiAgICAucmVwbGFjZSgvXi4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGNvcHlQcm9wcyA9ICh0YXJnZXRDbGFzcywgc291cmNlQ2xhc3MpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHNvdXJjZUNsYXNzO1xuICBsZXQgcHJvcE5hbWVzVGFyZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICApLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldENsYXNzLnByb3RvdHlwZSkpO1xuICB3aGlsZSAoc291cmNlLm5hbWUgIT09IFwiXCIpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UucHJvdG90eXBlKVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZS5wcm90b3R5cGUpKVxuICAgICAgLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AubWF0Y2goXG4gICAgICAgICAgICAvXig/OmNvbnN0cnVjdG9yfHByb3RvdHlwZXxhcmd1bWVudHN8Y2FsbGVyfG5hbWV8YmluZHxjYWxsfGFwcGx5fHRvU3RyaW5nfGxlbmd0aCkkLyxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvcE5hbWVzVGFyZ2V0LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcHJvcE5hbWVzVGFyZ2V0LnB1c2gocHJvcCk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgcHJvcCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgc291cmNlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIH1cbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBiYXNlQ2xhc3NcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBtaXhpbnNcbiAqIEByZXR1cm5zIHt0eXBlb2YgQWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2lsZUFnZ3JlZ2F0aW9uKGJhc2VDbGFzcywgLi4ubWl4aW5zKSB7XG4gIGxldCBiYXNlID0ge1xuICAgIFtiYXNlQ2xhc3MubmFtZV06IGNsYXNzIHtcbiAgICAgIGNvbnN0cnVjdG9yKC4uLl9hcmdzKSB7XG4gICAgICAgIGxldCBfbWl4aW5zID0ge307XG4gICAgICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICAgIGxldCBuZXdNaXhpbjtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIChuZXdNaXhpbiA9IG5ldyBtaXhpbigpKSk7XG4gICAgICAgICAgbmV3TWl4aW4uX3RhZ05hbWUgPSBtaXhpbi5wcm90b3R5cGUuX3RhZ05hbWU7XG4gICAgICAgICAgbmV3TWl4aW4uX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICAgIF9taXhpbnNbbWl4aW4ubmFtZV0gPSBuZXdNaXhpbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBuZXcgYmFzZUNsYXNzKCkpO1xuICAgICAgICB0aGlzLl9taXhpbnMgPSBfbWl4aW5zO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBiYXNlQ2xhc3MubmFtZTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIH1cblxuICAgICAgZ2V0IG1peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21peGlucztcbiAgICAgIH1cbiAgICB9LFxuICB9W2Jhc2VDbGFzcy5uYW1lXTtcblxuICBjb3B5UHJvcHMoYmFzZSwgYmFzZUNsYXNzKTtcblxuICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICBjb3B5UHJvcHMoYmFzZSwgbWl4aW4pO1xuICB9KTtcblxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gY3NyZlNhZmVNZXRob2QobWV0aG9kKSB7XG4gIC8vIHRoZXNlIEhUVFAgbWV0aG9kcyBkbyBub3QgcmVxdWlyZSBDU1JGIHByb3RlY3Rpb25cbiAgcmV0dXJuIC9eKEdFVHxIRUFEfE9QVElPTlN8VFJBQ0UpJC8udGVzdChtZXRob2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwsIG1ldGhvZCkge1xuICByZXR1cm4gJC5hamF4KHtcbiAgICB1cmw6IHVybCwgLy9TZXJ2ZXIgc2NyaXB0IHRvIHByb2Nlc3MgZGF0YVxuICAgIHR5cGU6IG1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICB4aHI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEN1c3RvbSBYTUxIdHRwUmVxdWVzdFxuICAgICAgdmFyIG15WGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICBpZiAobXlYaHIudXBsb2FkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHVwbG9hZCBwcm9wZXJ0eSBleGlzdHNcbiAgICAgICAgbXlYaHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTsgLy8gRm9yIGhhbmRsaW5nIHRoZSBwcm9ncmVzcyBvZiB0aGUgdXBsb2FkXG4gICAgICB9XG4gICAgICByZXR1cm4gbXlYaHI7XG4gICAgfSxcbiAgICAvL0Zvcm0gZGF0YVxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgIC8vT3B0aW9ucyB0byB0ZWxsIGpRdWVyeSBub3QgdG8gcHJvY2VzcyBkYXRhIG9yIHdvcnJ5IGFib3V0IGNvbnRlbnQtdHlwZS5cbiAgICBjYWNoZTogZmFsc2UsXG4gICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgaWYgKCFjc3JmU2FmZU1ldGhvZChzZXR0aW5ncy50eXBlKSAmJiAhdGhpcy5jcm9zc0RvbWFpbikge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uKGUpIHtcbiAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgIHZhciBwZXJjZW50VmFsID0gTWF0aC5yb3VuZCgoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMCk7XG4gICAgdmFyICRwcm9ncmVzc0NvbnRhaW5lciA9ICQoXCIucHJvZ3Jlc3MtY29udGFpbmVyXCIpO1xuICAgIGlmIChwZXJjZW50VmFsID09PSAxMDApIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcGVyY2VudFZhbCArPSBcIiVcIjtcblxuICAgICRwcm9ncmVzc0NvbnRhaW5lclxuICAgICAgLmZpbmQoXCIucHJvZ3Jlc3MtYmFyXCIpXG4gICAgICAuY3NzKHt3aWR0aDogcGVyY2VudFZhbH0pXG4gICAgICAudGV4dChwZXJjZW50VmFsKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nKFxuICBwYXJhbUVsZW1lbnQsXG4gIGNvbnRyb2xsZXIgPSBudWxsLFxuKSB7XG4gIGlmICh0eXBlb2YgcGFyYW1FbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbiAgfVxuXG4gIGlmIChjb250cm9sbGVyICYmIHR5cGVvZiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlcltwYXJhbUVsZW1lbnRdLmJpbmQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF07XG4gIH1cblxuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudCA9PT0gXCJ0cnVlXCI7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJub25lXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNJbnRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHBhcmFtRWxlbWVudCk7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocGFyYW1FbGVtZW50KTtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudC5zdWJzdHIoMSwgcGFyYW1FbGVtZW50Lmxlbmd0aCAtIDIpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgcmV0dXJuIChbMWU3XSArIC0xZTMgKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCAoYykgPT5cbiAgICAoXG4gICAgICBjIF5cbiAgICAgIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmICgxNSA+PiAoYyAvIDQpKSlcbiAgICApLnRvU3RyaW5nKDE2KSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKSB7XG4gICRmb3JtXG4gICAgLmZpbmQoXCIuaGFzLWVycm9yXCIpXG4gICAgLnJlbW92ZUNsYXNzKFwiaGFzLWVycm9yXCIpXG4gICAgLmZpbmQoXCIuYWxlcnQtZGFuZ2VyXCIpXG4gICAgLnJlbW92ZSgpO1xuICAkZm9ybS5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIikucmVtb3ZlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFcnJvcnNJbkZvcm0oJGZvcm0sICRyZXNGb3JtKSB7XG4gICRyZXNGb3JtID0gJChcIjxkaXY+XCIpLmFwcGVuZCgkcmVzRm9ybSk7XG5cbiAgJGZvcm1cbiAgICAuZmluZChcIi5oYXMtZXJyb3JcIilcbiAgICAucmVtb3ZlQ2xhc3MoXCJoYXMtZXJyb3JcIilcbiAgICAuZmluZChcIi5hbGVydC1kYW5nZXJcIilcbiAgICAuc2FmZVJlbW92ZSgpO1xuICAkZm9ybS5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIikuc2FmZVJlbW92ZSgpO1xuICBsZXQgJGZpbGVfY29udGFpbmVyID0gJHJlc0Zvcm0uZmluZChcImlucHV0W3R5cGU9ZmlsZV1cIikucGFyZW50KCk7XG4gICRmb3JtXG4gICAgLmZpbmQoXCJpbnB1dFt0eXBlPWZpbGVdXCIpXG4gICAgLnBhcmVudCgpXG4gICAgLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKCRmaWxlX2NvbnRhaW5lcltpbmRleF0pO1xuICAgIH0pO1xuXG4gIGxldCBoYXNOb0Vycm9yID1cbiAgICAkcmVzRm9ybVxuICAgICAgLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKVxuICAgICAgLmluc2VydEFmdGVyKCRmb3JtLmZpbmQoXCIuaGlkZGVuLWZvcm0tZmllbGRzXCIpKS5sZW5ndGggPT09IDA7XG4gICRyZXNGb3JtLmZpbmQoXCIuaGFzLWVycm9yXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGhhc05vRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgJHJlc0Vycm9yRmllbGQgPSAkKHRoaXMpO1xuICAgIGxldCBjbGFzc05hbWUgPSAkcmVzRXJyb3JGaWVsZC5kYXRhKFwiYXV0by1pZFwiKTtcbiAgICBsZXQgJGVycm9yRmllbGQgPSAkZm9ybS5maW5kKFwiLmZvcm0tZ3JvdXAuXCIgKyBjbGFzc05hbWUpO1xuICAgICRlcnJvckZpZWxkLmFkZENsYXNzKFwiaGFzLWVycm9yXCIpO1xuICAgICRlcnJvckZpZWxkXG4gICAgICAuZmluZChcIi5mb3JtLWlucHV0LWNvbnRhaW5lclwiKVxuICAgICAgLmFwcGVuZCgkcmVzRXJyb3JGaWVsZC5maW5kKFwiLmFsZXJ0LWRhbmdlclwiKSk7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNOb0Vycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganF1ZXJ5SW5zZXJ0QXQoJGNvbnRhaW5lciwgaW5kZXgsICRuZXdFbGVtZW50KSB7XG4gIGxldCBsYXN0SW5kZXggPSAkY29udGFpbmVyLmNoaWxkcmVuKCkuc2l6ZSgpO1xuICBpZiAoaW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAkY29udGFpbmVyLmNoaWxkcmVuKCkuZXEoaW5kZXgpLmJlZm9yZSgkbmV3RWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAgJGNvbnRhaW5lci5hcHBlbmQoJG5ld0VsZW1lbnQpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFBhcnNlIGhpZGRlbiBpbnB1dCB2YWx1ZXMgYmFjayBpbnRvIHRoZSBjbG9zZXN0IEphdmFTY3JpcHQgcHJpbWl0aXZlLlxuICpcbiAqIEhpZGRlbiBpbnB1dHMgYXJlIG9mdGVuIHVzZWQgdG8gcHJlc2VydmUgdmFsdWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGJvb2xlYW5zLFxuICogbnVtYmVycyBvciBxdW90ZWQgc3RyaW5ncy4gVGhpcyBrZWVwcyBmb3JtLXRvLW1vZGVsIHN5bmMgZnJvbSB0dXJuaW5nXG4gKiBldmVyeXRoaW5nIGludG8gcGxhaW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBwYXJzZUhpZGRlbklucHV0cyh2YWx1ZSkge1xuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goaXNCb29sUmVnKSkge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJub25lXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0ludFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSB7XG4gIGxldCB7dHlwZSwgbmFtZX0gPSBmb3JtSXRlbTtcbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gXCJcIikge1xuICAgIGlmICh0eXBlID09PSBcImhpZGRlblwiKSB7XG4gICAgICByZXR1cm4gcGFyc2VIaWRkZW5JbnB1dHMoJChmb3JtSXRlbSkudmFsKCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbS5jaGVja2VkO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgcmV0dXJuIGZvcm1JdGVtLmZpbGVzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAkKGZvcm1JdGVtKS52YWwoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCB2YWx1ZSkge1xuICBsZXQge3R5cGUsIG5hbWV9ID0gZm9ybUl0ZW07XG4gIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIpIHtcblxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIGZvcm1JdGVtLmNoZWNrZWQgPSAhIXZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBEYXRhVHJhbnNmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBsZXQgY29udGFpbmVyID0gbmV3IERhdGFUcmFuc2ZlcigpO1xuICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5hZGQodmFsdWUpO1xuICAgICAgICAgIGZvcm1JdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAkKGZvcm1JdGVtKS52YWwodmFsdWUuaWQpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkge1xuICAgICAgJChmb3JtSXRlbSkudmFsKGBbJHt2YWx1ZS5nZXRJZHMoKS5qb2luKCcsJyl9XWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgJChmb3JtSXRlbSkudmFsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibmFtZXMiOlsiU2RjTW9kZWwiLCJTZGNRdWVyeVNldCIsIl8kYm9keSIsImFyZ19uYW1lc19yZWciLCJjb21tZW5kX3JlZyIsImdldEJvZHkiLCIkIiwiZ2V0UGFyYW1zTmFtZU9mRnVuY3Rpb24iLCJmdW5jIiwiZm5zdHIiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJyZXN1bHQiLCJzbGljZSIsImluZGV4T2YiLCJtYXRjaCIsInByb21pc2VEdW1teUZhY3RvcnkiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbWVsQ2FzZVRvVGFnTmFtZSIsInN0ciIsImxldHRlciIsInRvTG93ZXJDYXNlIiwibnVtYmVyIiwidGFnTmFtZVRvQ2FtZWxDYXNlIiwidG9VcHBlckNhc2UiLCJ0YWdOYW1lVG9SZWFkYWJsZU5hbWUiLCJjb3B5UHJvcHMiLCJ0YXJnZXRDbGFzcyIsInNvdXJjZUNsYXNzIiwic291cmNlIiwicHJvcE5hbWVzVGFyZ2V0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsImNvbmNhdCIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm5hbWUiLCJmb3JFYWNoIiwicHJvcCIsImluY2x1ZGVzIiwicHVzaCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0UHJvdG90eXBlT2YiLCJhZ2lsZUFnZ3JlZ2F0aW9uIiwiYmFzZUNsYXNzIiwibWl4aW5zIiwiYmFzZSIsImNvbnN0cnVjdG9yIiwiX2FyZ3MiLCJfbWl4aW5zIiwibWl4aW4iLCJuZXdNaXhpbiIsImFzc2lnbiIsIl90YWdOYW1lIiwiX2lzTWl4aW4iLCJjbGFzc05hbWUiLCJjc3JmU2FmZU1ldGhvZCIsIm1ldGhvZCIsInRlc3QiLCJ1cGxvYWRGaWxlRm9ybURhdGEiLCJmb3JtRGF0YSIsInVybCIsImFqYXgiLCJ0eXBlIiwieGhyIiwibXlYaHIiLCJhamF4U2V0dGluZ3MiLCJ1cGxvYWQiLCJhZGRFdmVudExpc3RlbmVyIiwicHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uIiwiZGF0YSIsImNhY2hlIiwiY29udGVudFR5cGUiLCJwcm9jZXNzRGF0YSIsImJlZm9yZVNlbmQiLCJzZXR0aW5ncyIsImNyb3NzRG9tYWluIiwic2V0UmVxdWVzdEhlYWRlciIsIndpbmRvdyIsIkNTUkZfVE9LRU4iLCJlIiwibGVuZ3RoQ29tcHV0YWJsZSIsInBlcmNlbnRWYWwiLCJNYXRoIiwicm91bmQiLCJsb2FkZWQiLCJ0b3RhbCIsIiRwcm9ncmVzc0NvbnRhaW5lciIsImhpZGUiLCJzaG93IiwiZmluZCIsImNzcyIsIndpZHRoIiwidGV4dCIsImNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyIsInBhcmFtRWxlbWVudCIsImNvbnRyb2xsZXIiLCJiaW5kIiwiaXNGbG9hdFJlZyIsImlzSW50UmVnIiwiaXNCb29sUmVnIiwiaXNTdHJpbmdSZWciLCJ1bmRlZmluZWQiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJzdWJzdHIiLCJsZW5ndGgiLCJ1dWlkdjQiLCJjIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiVWludDhBcnJheSIsImNsZWFyRXJyb3JzSW5Gb3JtIiwiJGZvcm0iLCJyZW1vdmVDbGFzcyIsInJlbW92ZSIsInNldEVycm9yc0luRm9ybSIsIiRyZXNGb3JtIiwiYXBwZW5kIiwic2FmZVJlbW92ZSIsIiRmaWxlX2NvbnRhaW5lciIsInBhcmVudCIsImVhY2giLCJpbmRleCIsInJlcGxhY2VXaXRoIiwiaGFzTm9FcnJvciIsImluc2VydEFmdGVyIiwiJHJlc0Vycm9yRmllbGQiLCIkZXJyb3JGaWVsZCIsImFkZENsYXNzIiwianF1ZXJ5SW5zZXJ0QXQiLCIkY29udGFpbmVyIiwiJG5ld0VsZW1lbnQiLCJsYXN0SW5kZXgiLCJjaGlsZHJlbiIsInNpemUiLCJlcSIsImJlZm9yZSIsInBhcnNlSGlkZGVuSW5wdXRzIiwidmFsdWUiLCJzdWJzdHJpbmciLCJnZXRWYWx1ZUZyb21GaWVsZCIsImZvcm1JdGVtIiwidmFsIiwiY2hlY2tlZCIsImZpbGVzIiwic2V0VmFsdWVJbkZpZWxkIiwiRmlsZSIsIkRhdGFUcmFuc2ZlciIsImNvbnRhaW5lciIsIml0ZW1zIiwiYWRkIiwiaWQiLCJnZXRJZHMiLCJqb2luIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
|
|
128
128
|
|
|
129
129
|
/***/ },
|
|
130
130
|
|