sdc_client 0.58.5 → 0.58.6

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
@@ -94,7 +94,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
94
94
  \********************************************/
95
95
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
96
96
 
97
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nclass SubModel {\n constructor(pk, model) {\n this.pk = pk;\n this._model = model;\n }\n\n /**\n * SDC Model Name\n * @param {string} model\n */\n set model(model) {\n this._model = model;\n }\n get model() {\n return this._model;\n }\n\n /**\n * Load the sub model.\n *\n * @param {AbstractSDC} controller\n * @returns {Model}\n */\n load(controller) {\n if (!this._model) {\n throw new TypeError(\"Model is not set!!\");\n }\n if (this.pk instanceof Array) {\n return controller.newModel(this._model, {\n pk__in: this.pk\n });\n }\n return controller.newModel(this._model, {\n pk: this.pk\n });\n }\n}\nconst ModelProxyHandler = {\n get(target, key) {\n const value = target[key] ?? undefined;\n if (value instanceof SubModel) {\n if (!value.pk && value.pk !== 0) {\n return null;\n }\n let newVal;\n if (value.pk instanceof Array) {\n newVal = value.pk.slice();\n } else {\n newVal = new Number(value.pk);\n }\n newVal.load = value.load.bind(value);\n return newVal;\n }\n return value;\n },\n set(target, key, value) {\n if (key in target) {\n const oldVal = target[key];\n if (oldVal instanceof SubModel) {\n if (value.hasOwnProperty('pk')) {\n oldVal.pk = value.pk;\n } else {\n try {\n oldVal.pk = JSON.parse(value);\n } catch {\n oldVal.pk = value;\n }\n }\n } else {\n target[key] = value;\n }\n } else {\n target[key] = value;\n }\n return true;\n }\n};\nfunction parse_hidden_inputs(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);\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}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\n this._onNoOpenRequests = [];\n this.values_list = [];\n this.values = {};\n this.model_name = model_name;\n this.model_query = model_query;\n this._is_connected = false;\n this._is_conneting_process = false;\n this._auto_reconnect = true;\n this.socket = null;\n this.open_request = {};\n this.on_update = () => {};\n this.on_create = () => {};\n this.form_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.values_list.length) {\n return {\n value: this.values_list[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n length() {\n return this.values_list.length;\n }\n byPk(pk) {\n if (pk !== null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let elem = this.values_list.find(elm => elm.pk === pk);\n if (!elem) {\n elem = new Proxy({\n pk: pk\n }, ModelProxyHandler);\n this.values_list.push(elem);\n }\n return elem;\n }\n return {\n pk: pk\n };\n }\n filter(model_query) {\n this.model_query = Object.assign({}, this.model_query, model_query);\n return this;\n }\n load() {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n listView(filter = {}, cbResolve = null, cbReject = null, templateContext = {}) {\n return this.view({\n filter,\n cbResolve,\n cbReject,\n templateContext,\n event_type: 'list_view'\n });\n }\n view({\n viewName = 'html_list_template',\n filter = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n event_type = 'named_view'\n }) {\n let $div_list = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type,\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.model_name,\n model_query: this.model_query,\n filter,\n template_context: templateContext\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $div_list;\n }\n detailView(pk = null, cb_resolve = null, cb_reject = null, template_context = {}) {\n pk = pk ?? -1;\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let $div_list = $('<div class=\"container-fluid\">');\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n load_promise.then(() => {\n if (pk === -1) {\n pk = this.values_list[0].pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query,\n pk,\n template_context\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n syncModelToForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n let self = this;\n $forms.each(function () {\n if (!this.hasAttribute('data-model_pk')) {\n return;\n }\n let pk = $(this).data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'checkbox') {\n form_item.checked = instance[name];\n } else if (form_item.type === 'file' && instance[name] instanceof File) {\n let container = new DataTransfer();\n container.items.add(instance[name]);\n form_item.files = container;\n } else {\n $(form_item).val(instance[name]);\n }\n }\n }\n });\n }\n syncForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n const self = this;\n let instances = [];\n $forms.each(function () {\n let $form = $(this);\n let pk = $form.data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'hidden') {\n instance[name] = parse_hidden_inputs($(form_item).val());\n } else if (form_item.type === 'checkbox') {\n instance[name] = form_item.checked;\n } else if (form_item.type === 'file') {\n instance[name] = form_item.files[0];\n } else {\n instance[name] = $(form_item).val();\n }\n }\n }\n instances.push(instance);\n return instance;\n });\n if (this.values_list.length <= 1 && instances.length > 0) {\n this.values = instances.at(-1);\n }\n return instances;\n }\n createForm(cb_resolve = null, cb_reject = null) {\n let $div_form = $('<div>');\n this.isConnected().then(() => {\n this._getForm(null, 'create_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n editForm(pk = -1, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div>');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'edit_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n namedForm(pk = -1, formName, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div class=\"container-fluid\">');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'named_form', formName, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n _getForm(pk, event_type, formName, $div_form, cb_resolve, cb_reject) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: event_type,\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk,\n form_name: formName\n }\n }));\n const className = pk === null || pk === -1 ? 'create' : 'edit';\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-${className}-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk).data('form_name', formName);\n if ($form.length > 0 && !$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelFormDistributor');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n }\n new() {\n return new Promise((resolve, reject) => {\n const $form = $('<form>').append(this.createForm(() => {\n this.syncFormToModel($form);\n resolve();\n }, reject));\n });\n }\n save(pk = -1, fromName = 'edit_form') {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n return this.isConnected().then(() => {\n let elem_list;\n if (pk > -1) {\n elem_list = [this.byPk(pk)];\n } else {\n elem_list = this.values_list;\n }\n let p_list = [];\n elem_list.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n p_list.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'save',\n event_id: id,\n args: {\n form_name: fromName,\n model_name: this.model_name,\n model_query: this.model_query,\n data: elem,\n files: files\n }\n }));\n this.open_request[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(p_list);\n });\n }\n create(values = this.values) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(values).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.model_name,\n model_query: this.model_query,\n data: values,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;\n if (this.values?.pk === -1) {\n this.values_list = [];\n this.values = null;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n if (pk === -1) pk = this.values?.pk;\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._is_connected) {\n resolve();\n } else if (!this._is_conneting_process || !this.open_request['_connecting_process']) {\n this._is_conneting_process = true;\n this.open_request['_connecting_process'] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];\n this.open_request['_connecting_process'] = [() => {\n resolve_origin();\n resolve();\n }, () => {\n reject_origin();\n reject();\n }];\n }\n });\n }\n close() {\n if (this.socket) {\n this._auto_reconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this['socket'];\n }\n }\n clean() {\n this.values_list = [];\n this.values = {};\n return this;\n }\n _readFiles(elem) {\n let to_solve = [];\n 100;\n let files = {};\n for (const [key, value] of Object.entries(elem)) {\n if (value instanceof File) {\n to_solve.push(new Promise((resolve, reject) => {\n ((key, value) => {\n let reader = new FileReader();\n reader.onload = e => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.open_request[id] = [resolve, reject];\n let result = e.target.result;\n let number_of_chunks = parseInt(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 < number_of_chunks; ++i) {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'upload',\n event_id: id,\n args: {\n chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),\n idx: i,\n number_of_chunks: number_of_chunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n }\n };\n reader.onerror = () => {\n reject();\n };\n reader.readAsBinaryString(value);\n })(key, value);\n }));\n }\n }\n return Promise.all(to_solve).then(() => {\n return files;\n });\n }\n _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][1](data);\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this.open_request['_connecting_process'][1](data);\n this._closeOpenRequest('_connecting_process');\n this._auto_reconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this._is_connected = true;\n this._is_conneting_process = false;\n this.open_request['_connecting_process'][0](data);\n this._closeOpenRequest('_connecting_process');\n } else if (['load', 'named_view', 'detail_view'].includes(data.type)) {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n data.args.data = this._parseServerRes(json_res);\n } else if (data.type === 'on_update' || data.type === 'on_create') {\n const json_res = JSON.parse(data.args.data);\n let obj = this._parseServerRes(json_res);\n let cb;\n if (data.type === 'on_create') {\n cb = this.on_create;\n } else {\n cb = this.on_update;\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.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.open_request).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n _closeOpenRequest(event_id) {\n delete this.open_request[event_id];\n if (Object.keys(this.open_request).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n _connectToServer() {\n return new Promise(resolve => {\n const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);\n this._is_connected = false;\n for (const [_key, value] of Object.entries(this.open_request)) {\n value[1](e);\n }\n this.open_request = {};\n setTimeout(() => {\n if (this._auto_reconnect) {\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._is_connected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n }\n _parseServerRes(res) {\n let updated = [];\n for (let json_data of res) {\n const pk = json_data.pk;\n const obj = this.byPk(pk);\n for (const [k, v] of Object.entries(json_data.fields)) {\n if (v && typeof v === 'object' && v['__is_sdc_model__']) {\n obj[k] = new SubModel(v['pk'], v['model']);\n } else {\n obj[k] = v;\n }\n }\n updated.push(obj);\n }\n if (this.values_list.length === 1) {\n this.values = this.values_list.at(-1);\n } else {\n this.values = {};\n }\n return updated;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBRTtNQUNqQyxJQUFJLENBQUNNLE1BQU0sR0FBRyxJQUFJLENBQUNELFdBQVcsQ0FBQytFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUM5RSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCO0lBRUEsT0FBT3lKLE9BQU87RUFFaEI7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzP2FkYmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthcHB9IGZyb20gJy4vc2RjX21haW4uanMnO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmNvbnN0IE1BWF9GSUxFX1VQTE9BRCA9IDI1MDAwO1xuXG5cbmNsYXNzIFN1Yk1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihwaywgbW9kZWwpIHtcbiAgICB0aGlzLnBrID0gcGs7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTREMgTW9kZWwgTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICovXG4gIHNldCBtb2RlbChtb2RlbCkge1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gIH1cblxuICBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHN1YiBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJucyB7TW9kZWx9XG4gICAqL1xuICBsb2FkKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTW9kZWwgaXMgbm90IHNldCEhXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wayBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5uZXdNb2RlbCh0aGlzLl9tb2RlbCwge3BrX19pbjogdGhpcy5wa30pO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5uZXdNb2RlbCh0aGlzLl9tb2RlbCwge3BrOiB0aGlzLnBrfSk7XG4gIH1cbn1cblxuY29uc3QgTW9kZWxQcm94eUhhbmRsZXIgPSB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV0gPz8gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICBpZiAoIXZhbHVlLnBrICYmIHZhbHVlLnBrICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBsZXQgbmV3VmFsO1xuICAgICAgaWYgKHZhbHVlLnBrIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgbmV3VmFsID0gdmFsdWUucGsuc2xpY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IG5ldyBOdW1iZXIodmFsdWUucGspO1xuICAgICAgfVxuICAgICAgbmV3VmFsLmxvYWQgPSB2YWx1ZS5sb2FkLmJpbmQodmFsdWUpO1xuICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKG9sZFZhbCBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgncGsnKSkge1xuICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlLnBrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvbGRWYWwucGsgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHBhcnNlX2hpZGRlbl9pbnB1dHModmFsdWUpIHtcblxuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cblxuICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdub25lJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzSW50UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cblxuZXhwb3J0IGNsYXNzIE1vZGVsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbF9uYW1lIHtzdHJpbmd9XG4gICAqIEBwYXJhbSBtb2RlbF9xdWVyeSB7anNvbn1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsX25hbWUsIG1vZGVsX3F1ZXJ5ID0ge30pIHtcbiAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdGhpcy5tb2RlbF9uYW1lID0gbW9kZWxfbmFtZTtcbiAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gbW9kZWxfcXVlcnk7XG4gICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IHRydWU7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMub3Blbl9yZXF1ZXN0ID0ge307XG4gICAgdGhpcy5vbl91cGRhdGUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICB0aGlzLm9uX2NyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtX2lkID0gdXVpZHY0KCk7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgaWR4ID0gLTE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgKytpZHg7XG4gICAgICAgIGlmIChpZHggPCB0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRoaXMudmFsdWVzX2xpc3RbaWR4XSwgZG9uZTogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoO1xuICB9XG5cbiAgYnlQayhwaykge1xuICAgIGlmIChwayAhPT0gbnVsbCkge1xuICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICAgIHBrID0gLTE7XG4gICAgICB9XG4gICAgICBsZXQgZWxlbSA9IHRoaXMudmFsdWVzX2xpc3QuZmluZChlbG0gPT4gZWxtLnBrID09PSBwayk7XG4gICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgZWxlbSA9IG5ldyBQcm94eSh7cGs6IHBrfSwgTW9kZWxQcm94eUhhbmRsZXIpO1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0LnB1c2goZWxlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgcmV0dXJuIHtwazogcGt9O1xuXG4gIH1cblxuICBmaWx0ZXIobW9kZWxfcXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbF9xdWVyeSwgbW9kZWxfcXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgIGV2ZW50X3R5cGU6ICdsb2FkJyxcbiAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoZmlsdGVyID0ge30sIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy52aWV3KHtmaWx0ZXIsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCwgZXZlbnRfdHlwZTogJ2xpc3Rfdmlldyd9KVxuICB9XG5cbiAgdmlldyh7XG4gICAgICAgICB2aWV3TmFtZSA9ICdodG1sX2xpc3RfdGVtcGxhdGUnLFxuICAgICAgICAgZmlsdGVyID0ge30sXG4gICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICBldmVudF90eXBlID0gJ25hbWVkX3ZpZXcnXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgZXZlbnRfdHlwZSxcbiAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgdmlld19uYW1lOiB2aWV3TmFtZSxcbiAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAkZGl2X2xpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgIGFwcC5yZWZyZXNoKCRkaXZfbGlzdCk7XG4gICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICB9XTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgfVxuXG4gIGRldGFpbFZpZXcocGsgPSBudWxsLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVfY29udGV4dCA9IHt9KSB7XG4gICAgcGsgPSBwayA/PyAtMTtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgbGV0IGxvYWRfcHJvbWlzZTtcbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggIT09IDApIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMuaXNDb25uZWN0ZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrID09PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3RbMF0ucGtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgIGV2ZW50X3R5cGU6ICdkZXRhaWxfdmlldycsXG4gICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICBwayxcbiAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9saXN0KTtcbiAgICAgICAgY2JfcmVzb2x2ZSAmJiBjYl9yZXNvbHZlKGRhdGEpO1xuICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICB9XTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgfVxuXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgc3luY01vZGVsVG9Gb3JtKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgIH1cblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLW1vZGVsX3BrJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHBrID0gJCh0aGlzKS5kYXRhKCdtb2RlbF9waycpO1xuICAgICAgbGV0IGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgIGZvciAobGV0IGZvcm1faXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZm9ybV9pdGVtLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgaWYgKGZvcm1faXRlbS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICBmb3JtX2l0ZW0uY2hlY2tlZCA9IGluc3RhbmNlW25hbWVdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJyAmJiBpbnN0YW5jZVtuYW1lXSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgICBjb250YWluZXIuaXRlbXMuYWRkKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICAgIGZvcm1faXRlbS5maWxlcyA9IGNvbnRhaW5lcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChmb3JtX2l0ZW0pLnZhbChpbnN0YW5jZVtuYW1lXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBpbnN0YW5jZXMgPSBbXTtcblxuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCAkZm9ybSA9ICQodGhpcyk7XG4gICAgICBsZXQgcGsgPSAkZm9ybS5kYXRhKCdtb2RlbF9waycpO1xuICAgICAgbGV0IGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgIGZvciAobGV0IGZvcm1faXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZm9ybV9pdGVtLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgaWYgKGZvcm1faXRlbS50eXBlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBwYXJzZV9oaWRkZW5faW5wdXRzKCQoZm9ybV9pdGVtKS52YWwoKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBmb3JtX2l0ZW0uY2hlY2tlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gZm9ybV9pdGVtLmZpbGVzWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9ICQoZm9ybV9pdGVtKS52YWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoIDw9IDEgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsdWVzID0gaW5zdGFuY2VzLmF0KC0xKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzO1xuXG4gIH1cblxuICBjcmVhdGVGb3JtKGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgbGV0ICRkaXZfZm9ybSA9ICQoJzxkaXY+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fZ2V0Rm9ybShudWxsLCAnY3JlYXRlX2Zvcm0nLCBudWxsLCAkZGl2X2Zvcm0sIGNiX3Jlc29sdmUsIGNiX3JlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9mb3JtO1xuICB9XG5cbiAgZWRpdEZvcm0ocGsgPSAtMSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdj4nKTtcblxuICAgIGxvYWRfcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChwayA8PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9nZXRGb3JtKHBrLCAnZWRpdF9mb3JtJywgbnVsbCwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfZm9ybTtcbiAgfVxuXG4gIG5hbWVkRm9ybShwayA9IC0xLCBmb3JtTmFtZSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIGxvYWRfcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChwayA8PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9nZXRGb3JtKHBrLCAnbmFtZWRfZm9ybScsIGZvcm1OYW1lLCAkZGl2X2Zvcm0sIGNiX3Jlc29sdmUsIGNiX3JlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9mb3JtO1xuICB9XG5cblxuICBfZ2V0Rm9ybShwaywgZXZlbnRfdHlwZSwgZm9ybU5hbWUsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KSB7XG4gICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgaWYgKGlzTmFOKHBrKSkge1xuICAgICAgcGsgPSAtMTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgZXZlbnRfdHlwZTogZXZlbnRfdHlwZSxcbiAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgcGs6IHBrLFxuICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lXG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gcGsgPT09IG51bGwgfHwgcGsgPT09IC0xID8gJ2NyZWF0ZScgOiAnZWRpdCc7XG5cbiAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICRkaXZfZm9ybS5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgIGxldCAkZm9ybSA9ICRkaXZfZm9ybS5jbG9zZXN0KCdmb3JtJylcbiAgICAgICAgLmFkZENsYXNzKGBzZGMtbW9kZWwtJHtjbGFzc05hbWV9LWZvcm0gc2RjLW1vZGVsLWZvcm0gJHt0aGlzLmZvcm1faWR9YClcbiAgICAgICAgLmRhdGEoJ21vZGVsJywgdGhpcylcbiAgICAgICAgLmRhdGEoJ21vZGVsX3BrJywgcGspXG4gICAgICAgIC5kYXRhKCdmb3JtX25hbWUnLCBmb3JtTmFtZSk7XG4gICAgICBpZiAoJGZvcm0ubGVuZ3RoID4gMCAmJiAhJGZvcm1bMF0uaGFzQXR0cmlidXRlKCdzZGNfc3VibWl0JykpIHtcbiAgICAgICAgJGZvcm0uYXR0cignc2RjX3N1Ym1pdCcsICdzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvcicpXG4gICAgICB9XG5cbiAgICAgIGFwcC5yZWZyZXNoKCRkaXZfZm9ybSk7XG4gICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgfSwgKHJlcykgPT4ge1xuICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgIH1dO1xuICB9XG5cbiAgbmV3KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCAkZm9ybSA9ICQoJzxmb3JtPicpLmFwcGVuZCh0aGlzLmNyZWF0ZUZvcm0oKCkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNGb3JtVG9Nb2RlbCgkZm9ybSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIHJlamVjdCkpO1xuICAgIH0pXG4gIH1cblxuICBzYXZlKHBrID0gLTEsIGZyb21OYW1lID0gJ2VkaXRfZm9ybScpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgbGV0IGVsZW1fbGlzdDtcbiAgICAgIGlmIChwayA+IC0xKSB7XG4gICAgICAgIGVsZW1fbGlzdCA9IFt0aGlzLmJ5UGsocGspXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1fbGlzdCA9IHRoaXMudmFsdWVzX2xpc3Q7XG4gICAgICB9XG4gICAgICBsZXQgcF9saXN0ID0gW11cbiAgICAgIGVsZW1fbGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgIHBfbGlzdC5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZWFkRmlsZXMoZWxlbSkudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3NhdmUnLFxuICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICBmb3JtX25hbWU6IGZyb21OYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICBkYXRhOiBlbGVtLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH0sIHJlamVjdF07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocF9saXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZSh2YWx1ZXMgPSB0aGlzLnZhbHVlcykge1xuICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRGaWxlcyh2YWx1ZXMpLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsocmVzKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHR5cGVvZiByZXMuZGF0YS5pbnN0YW5jZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKSA6IHJlcy5kYXRhLmluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzPy5wayA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpWzBdO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgIH0sIHJlamVjdF07XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShwayA9IC0xKSB7XG4gICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgaWYgKGlzTmFOKHBrKSkge1xuICAgICAgcGsgPSAtMTtcbiAgICB9XG4gICAgaWYgKHBrID09PSAtMSkgcGsgPSB0aGlzLnZhbHVlcz8ucGs7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgZXZlbnRfdHlwZTogJ2RlbGV0ZScsXG4gICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgcGs6IHBrXG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNfY29ubmVjdGVkKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzIHx8ICF0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddKSB7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFsoKSA9PiB7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfV1cbiAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9jaGVja0Nvbm5lY3Rpb24oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3Jlc29sdmVfb3JpZ2luLCByZWplY3Rfb3JpZ2luXSA9IHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ107XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ10gPSBbXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZV9vcmlnaW4oKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdF9vcmlnaW4oKTtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXNbJ3NvY2tldCddO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIHRoaXMudmFsdWVzX2xpc3QgPSBbXTtcbiAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgX3JlYWRGaWxlcyhlbGVtKSB7XG4gICAgbGV0IHRvX3NvbHZlID0gW107XG4gICAgMTAwXG4gICAgbGV0IGZpbGVzID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbGVtKSkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICB0b19zb2x2ZS5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAoKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcblxuICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICBsZXQgbnVtYmVyX29mX2NodW5rcyA9IHBhcnNlSW50KE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gTUFYX0ZJTEVfVVBMT0FEKSk7XG4gICAgICAgICAgICAgIGZpbGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyX29mX2NodW5rczsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICd1cGxvYWQnLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBjaHVuazogcmVzdWx0LnNsaWNlKE1BWF9GSUxFX1VQTE9BRCAqIGksIE1BWF9GSUxFX1VQTE9BRCAqIChpICsgMSkpLFxuICAgICAgICAgICAgICAgICAgICBpZHg6IGksXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaHVua3M6IG51bWJlcl9vZl9jaHVua3MsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICB9KShrZXksIHZhbHVlKTtcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRvX3NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWxlc1xuICAgIH0pO1xuICB9XG5cbiAgX29uTWVzc2FnZShlKSB7XG4gICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgaWYgKGRhdGEuaXNfZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLm9wZW5fcmVxdWVzdC5oYXNPd25Qcm9wZXJ0eShkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXVsxXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdCgnX2Nvbm5lY3RpbmdfcHJvY2VzcycpO1xuICAgICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKCdwdXNoTXNnJywgZGF0YS5oZWFkZXIgfHwgJycsIGRhdGEubXNnIHx8ICcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ11bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoJ19jb25uZWN0aW5nX3Byb2Nlc3MnKTtcbiAgICAgIH0gZWxzZSBpZiAoWydsb2FkJywgJ25hbWVkX3ZpZXcnLCAnZGV0YWlsX3ZpZXcnXS5pbmNsdWRlcyhkYXRhLnR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGpzb25fcmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG4gICAgICAgIHRoaXMudmFsdWVzX2xpc3QgPSBbXTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uX3Jlcyk7XG5cbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnb25fdXBkYXRlJyB8fCBkYXRhLnR5cGUgPT09ICdvbl9jcmVhdGUnKSB7XG4gICAgICAgIGNvbnN0IGpzb25fcmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG5cbiAgICAgICAgbGV0IG9iaiA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcbiAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdvbl9jcmVhdGUnKSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uX2NyZWF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25fdXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2Iob2JqKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBvYmo7XG5cbiAgICAgIH1cblxuICAgICAgbGV0IGluc3RhbmNlID0gZGF0YS5kYXRhPy5pbnN0YW5jZVxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuZGF0YS5pbnN0YW5jZSA9IEpTT04ucGFyc2UoZGF0YS5kYXRhLmluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzBdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5vT3BlblJlcXVlc3RzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5fcmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMucHVzaChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jbG9zZU9wZW5SZXF1ZXN0KGV2ZW50X2lkKSB7XG4gICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0W2V2ZW50X2lkXTtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcGVuX3JlcXVlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5mb3JFYWNoKHggPT4geCgpKTtcbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB9XG5cbiAgfVxuXG4gIF9jb25uZWN0VG9TZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGNvbnN0IG1vZGVsX2lkZW50aWZpZXIgPSBgJHt0aGlzLm1vZGVsX25hbWV9YCArICh0aGlzLm1vZGVsX2lkID4gMCA/IGAvJHt0aGlzLm1vZGVsX2lkfWAgOiAnJyk7XG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3NzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxfaWRlbnRpZmllcn1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgfVxuXG5cbiAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgU0RDIE1vZGVsICgke3RoaXMubW9kZWxfbmFtZX0sICR7dGhpcy5tb2RlbF9pZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCk7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcGVuX3JlcXVlc3QpKSB7XG4gICAgICAgICAgdmFsdWVbMV0oZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3QgPSB7fTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fYXV0b19yZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE1vZGVsIFNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJHtlcnJ9IENsb3Npbmcgc29ja2V0YCk7XG4gICAgICAgIGlmICh0aGlzLl9pc19jb25uZWN0ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIF9jaGVja0Nvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICBldmVudF90eXBlOiAnY29ubmVjdCcsXG4gICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xuICB9XG5cbiAgX3BhcnNlU2VydmVyUmVzKHJlcykge1xuICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgZm9yIChsZXQganNvbl9kYXRhIG9mIHJlcykge1xuICAgICAgY29uc3QgcGsgPSBqc29uX2RhdGEucGs7XG4gICAgICBjb25zdCBvYmogPSB0aGlzLmJ5UGsocGspO1xuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoanNvbl9kYXRhLmZpZWxkcykpIHtcbiAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHZbJ19faXNfc2RjX21vZGVsX18nXSkge1xuICAgICAgICAgIG9ialtrXSA9IG5ldyBTdWJNb2RlbCh2WydwayddLCB2Wydtb2RlbCddKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlZC5wdXNoKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHRoaXMudmFsdWVzX2xpc3QuYXQoLTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuXG4gIH1cbn0iXSwibmFtZXMiOlsiYXBwIiwidHJpZ2dlciIsInV1aWR2NCIsIk1BWF9GSUxFX1VQTE9BRCIsIlN1Yk1vZGVsIiwiY29uc3RydWN0b3IiLCJwayIsIm1vZGVsIiwiX21vZGVsIiwibG9hZCIsImNvbnRyb2xsZXIiLCJUeXBlRXJyb3IiLCJBcnJheSIsIm5ld01vZGVsIiwicGtfX2luIiwiTW9kZWxQcm94eUhhbmRsZXIiLCJnZXQiLCJ0YXJnZXQiLCJrZXkiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm5ld1ZhbCIsInNsaWNlIiwiTnVtYmVyIiwiYmluZCIsInNldCIsIm9sZFZhbCIsImhhc093blByb3BlcnR5IiwiSlNPTiIsInBhcnNlIiwicGFyc2VfaGlkZGVuX2lucHV0cyIsImlzRmxvYXRSZWciLCJpc0ludFJlZyIsImlzQm9vbFJlZyIsImlzU3RyaW5nUmVnIiwidG9Mb3dlckNhc2UiLCJtYXRjaCIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsInN1YnN0cmluZyIsImxlbmd0aCIsIk1vZGVsIiwibW9kZWxfbmFtZSIsIm1vZGVsX3F1ZXJ5IiwiX29uTm9PcGVuUmVxdWVzdHMiLCJ2YWx1ZXNfbGlzdCIsInZhbHVlcyIsIl9pc19jb25uZWN0ZWQiLCJfaXNfY29ubmV0aW5nX3Byb2Nlc3MiLCJfYXV0b19yZWNvbm5lY3QiLCJzb2NrZXQiLCJvcGVuX3JlcXVlc3QiLCJvbl91cGRhdGUiLCJvbl9jcmVhdGUiLCJmb3JtX2lkIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJpZHgiLCJuZXh0IiwiZG9uZSIsImJ5UGsiLCJpc05hTiIsImVsZW0iLCJmaW5kIiwiZWxtIiwiUHJveHkiLCJwdXNoIiwiZmlsdGVyIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNDb25uZWN0ZWQiLCJ0aGVuIiwiaWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNlbmQiLCJzdHJpbmdpZnkiLCJldmVudCIsImV2ZW50X3R5cGUiLCJldmVudF9pZCIsImFyZ3MiLCJsaXN0VmlldyIsImNiUmVzb2x2ZSIsImNiUmVqZWN0IiwidGVtcGxhdGVDb250ZXh0IiwidmlldyIsInZpZXdOYW1lIiwiJGRpdl9saXN0IiwiJCIsInZpZXdfbmFtZSIsInRlbXBsYXRlX2NvbnRleHQiLCJkYXRhIiwiYXBwZW5kIiwiaHRtbCIsInJlZnJlc2giLCJyZXMiLCJkZXRhaWxWaWV3IiwiY2JfcmVzb2x2ZSIsImNiX3JlamVjdCIsImxvYWRfcHJvbWlzZSIsInN5bmNGb3JtVG9Nb2RlbCIsIiRmb3JtcyIsInN5bmNGb3JtIiwic3luY01vZGVsVG9Gb3JtIiwiaGFzQ2xhc3MiLCJzZWxmIiwiZWFjaCIsImhhc0F0dHJpYnV0ZSIsImluc3RhbmNlIiwiZm9ybV9pdGVtIiwiZWxlbWVudHMiLCJuYW1lIiwidHlwZSIsImNoZWNrZWQiLCJGaWxlIiwiY29udGFpbmVyIiwiRGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJhZGQiLCJmaWxlcyIsInZhbCIsImluc3RhbmNlcyIsIiRmb3JtIiwiYXQiLCJjcmVhdGVGb3JtIiwiJGRpdl9mb3JtIiwiX2dldEZvcm0iLCJlZGl0Rm9ybSIsIm5hbWVkRm9ybSIsImZvcm1OYW1lIiwiZm9ybV9uYW1lIiwiY2xhc3NOYW1lIiwiY2xvc2VzdCIsImFkZENsYXNzIiwiYXR0ciIsIm5ldyIsInNhdmUiLCJmcm9tTmFtZSIsImVsZW1fbGlzdCIsInBfbGlzdCIsImZvckVhY2giLCJfcmVhZEZpbGVzIiwiX3BhcnNlU2VydmVyUmVzIiwiYWxsIiwiY3JlYXRlIiwiZGVsZXRlIiwiX2Nvbm5lY3RUb1NlcnZlciIsIl9jaGVja0Nvbm5lY3Rpb24iLCJyZXNvbHZlX29yaWdpbiIsInJlamVjdF9vcmlnaW4iLCJjbG9zZSIsIm9uY2xvc2UiLCJjbGVhbiIsInRvX3NvbHZlIiwiZW50cmllcyIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJlIiwicmVzdWx0IiwibnVtYmVyX29mX2NodW5rcyIsIk1hdGgiLCJjZWlsIiwiZmlsZV9uYW1lIiwiZmllbGRfbmFtZSIsImNvbnRlbnRfbGVuZ3RoIiwic2l6ZSIsImkiLCJjaHVuayIsImNvbnRlbnRfdHlwZSIsIm9uZXJyb3IiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJfb25NZXNzYWdlIiwiaXNfZXJyb3IiLCJfY2xvc2VPcGVuUmVxdWVzdCIsIm1zZyIsImhlYWRlciIsImluY2x1ZGVzIiwianNvbl9yZXMiLCJvYmoiLCJjYiIsIm5vT3BlblJlcXVlc3RzIiwia2V5cyIsIngiLCJtb2RlbF9pZGVudGlmaWVyIiwibW9kZWxfaWQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInByb3RvY29sIiwiV2ViU29ja2V0IiwiaG9zdCIsIm9ubWVzc2FnZSIsImNvbnNvbGUiLCJlcnJvciIsIl9rZXkiLCJzZXRUaW1lb3V0IiwiZXJyIiwib25vcGVuIiwidXBkYXRlZCIsImpzb25fZGF0YSIsImsiLCJ2IiwiZmllbGRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n\n}");
97
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nclass SubModel {\n constructor(pk, model) {\n this.pk = pk;\n this._model = model;\n }\n\n /**\n * SDC Model Name\n * @param {string} model\n */\n set model(model) {\n this._model = model;\n }\n get model() {\n return this._model;\n }\n\n /**\n * Load the sub model.\n *\n * @param {AbstractSDC} controller\n * @returns {Model}\n */\n load(controller) {\n if (!this._model) {\n throw new TypeError(\"Model is not set!!\");\n }\n if (this.pk instanceof Array) {\n return controller.newModel(this._model, {\n pk__in: this.pk\n });\n }\n return controller.newModel(this._model, {\n pk: this.pk\n });\n }\n}\nconst ModelProxyHandler = {\n get(target, key) {\n const value = target[key] ?? undefined;\n if (value instanceof SubModel) {\n if (!value.pk && value.pk !== 0) {\n return null;\n }\n let newVal;\n if (value.pk instanceof Array) {\n newVal = value.pk.slice();\n } else {\n newVal = new Number(value.pk);\n }\n newVal.load = value.load.bind(value);\n return newVal;\n }\n return value;\n },\n set(target, key, value) {\n if (key in target) {\n const oldVal = target[key];\n if (oldVal instanceof SubModel) {\n if (value.hasOwnProperty('pk')) {\n oldVal.pk = value.pk;\n } else {\n try {\n oldVal.pk = JSON.parse(value);\n } catch {\n oldVal.pk = value;\n }\n }\n } else {\n target[key] = value;\n }\n } else {\n target[key] = value;\n }\n return true;\n }\n};\nfunction parse_hidden_inputs(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);\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}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\n this._onNoOpenRequests = [];\n this.values_list = [];\n this.values = {};\n this.model_name = model_name;\n this.model_query = model_query;\n this._is_connected = false;\n this._is_conneting_process = false;\n this._auto_reconnect = true;\n this.socket = null;\n this.open_request = {};\n this.on_update = () => {};\n this.on_create = () => {};\n this.form_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.values_list.length) {\n return {\n value: this.values_list[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n length() {\n return this.values_list.length;\n }\n byPk(pk) {\n if (pk !== null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let elem = this.values_list.find(elm => elm.pk === pk);\n if (!elem) {\n elem = new Proxy({\n pk: pk\n }, ModelProxyHandler);\n this.values_list.push(elem);\n }\n return elem;\n }\n return {\n pk: pk\n };\n }\n filter(model_query) {\n this.model_query = Object.assign({}, this.model_query, model_query);\n return this;\n }\n load() {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n listView(filter = {}, cbResolve = null, cbReject = null, templateContext = {}) {\n return this.view({\n filter,\n cbResolve,\n cbReject,\n templateContext,\n event_type: 'list_view'\n });\n }\n view({\n viewName = 'html_list_template',\n filter = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n event_type = 'named_view'\n }) {\n let $div_list = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type,\n event_id: id,\n args: {\n view_name: viewName,\n model_name: this.model_name,\n model_query: this.model_query,\n filter,\n template_context: templateContext\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cbResolve && cbResolve(data);\n }, res => {\n cbReject && cbReject(res);\n }];\n });\n return $div_list;\n }\n detailView(pk = null, cb_resolve = null, cb_reject = null, template_context = {}) {\n pk = pk ?? -1;\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let $div_list = $('<div class=\"container-fluid\">');\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n load_promise.then(() => {\n if (pk === -1) {\n pk = this.values_list[0].pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query,\n pk,\n template_context\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n syncModelToForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n let self = this;\n $forms.each(function () {\n let pk = $(this).data('model_pk');\n let instance = null;\n if (pk === -1 && (self.values.pk === undefined || self.values.pk === -1)) {\n instance = self.values;\n } else if (pk !== undefined && pk !== null) {\n instance = self.byPk(pk);\n }\n if (!instance) {\n return;\n }\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'checkbox') {\n form_item.checked = instance[name];\n } else if (form_item.type === 'file') {\n if (instance[name] instanceof File) {\n let container = new DataTransfer();\n container.items.add(instance[name]);\n form_item.files = container;\n }\n } else {\n $(form_item).val(instance[name]);\n }\n }\n }\n });\n }\n syncForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n const self = this;\n let instances = [];\n $forms.each(function () {\n let $form = $(this);\n let pk = $form.data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'hidden') {\n instance[name] = parse_hidden_inputs($(form_item).val());\n } else if (form_item.type === 'checkbox') {\n instance[name] = form_item.checked;\n } else if (form_item.type === 'file') {\n instance[name] = form_item.files[0];\n } else {\n instance[name] = $(form_item).val();\n }\n }\n }\n instances.push(instance);\n return instance;\n });\n if (this.values_list.length <= 1 && instances.length > 0) {\n this.values = instances.at(-1);\n }\n return instances;\n }\n createForm(cb_resolve = null, cb_reject = null) {\n let $div_form = $('<div>');\n this.isConnected().then(() => {\n this._getForm(null, 'create_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n editForm(pk = -1, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div>');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'edit_form', null, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n namedForm(pk = -1, formName, cb_resolve = null, cb_reject = null) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div class=\"container-fluid\">');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n this._getForm(pk, 'named_form', formName, $div_form, cb_resolve, cb_reject);\n });\n return $div_form;\n }\n _getForm(pk, event_type, formName, $div_form, cb_resolve, cb_reject) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: event_type,\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk,\n form_name: formName\n }\n }));\n const className = pk === null || pk === -1 ? 'create' : 'edit';\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-${className}-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk).data('form_name', formName);\n if ($form.length > 0 && !$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelFormDistributor');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n }\n new() {\n return new Promise((resolve, reject) => {\n const $form = $('<form>').append(this.createForm(() => {\n this.syncFormToModel($form);\n resolve();\n }, reject));\n });\n }\n save(pk = -1, fromName = 'edit_form') {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n return this.isConnected().then(() => {\n let elem_list;\n if (pk > -1) {\n elem_list = [this.byPk(pk)];\n } else {\n elem_list = this.values_list;\n }\n let p_list = [];\n elem_list.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n p_list.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'save',\n event_id: id,\n args: {\n form_name: fromName,\n model_name: this.model_name,\n model_query: this.model_query,\n data: elem,\n files: files\n }\n }));\n this.open_request[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(p_list);\n });\n }\n create(values = this.values) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(values).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.model_name,\n model_query: this.model_query,\n data: values,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;\n if (this.values?.pk === -1) {\n this.values_list = [];\n this.values = null;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\n pk = parseInt(pk);\n if (isNaN(pk)) {\n pk = -1;\n }\n if (pk === -1) pk = this.values?.pk;\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._is_connected) {\n resolve();\n } else if (!this._is_conneting_process || !this.open_request['_connecting_process']) {\n this._is_conneting_process = true;\n this.open_request['_connecting_process'] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];\n this.open_request['_connecting_process'] = [() => {\n resolve_origin();\n resolve();\n }, () => {\n reject_origin();\n reject();\n }];\n }\n });\n }\n close() {\n if (this.socket) {\n this._auto_reconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this['socket'];\n }\n }\n clean() {\n this.values_list = [];\n this.values = {};\n return this;\n }\n _readFiles(elem) {\n let to_solve = [];\n 100;\n let files = {};\n for (const [key, value] of Object.entries(elem)) {\n if (value instanceof File) {\n to_solve.push(new Promise((resolve, reject) => {\n ((key, value) => {\n let reader = new FileReader();\n reader.onload = e => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.open_request[id] = [resolve, reject];\n let result = e.target.result;\n let number_of_chunks = parseInt(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 < number_of_chunks; ++i) {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'upload',\n event_id: id,\n args: {\n chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),\n idx: i,\n number_of_chunks: number_of_chunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n }\n };\n reader.onerror = () => {\n reject();\n };\n reader.readAsBinaryString(value);\n })(key, value);\n }));\n }\n }\n return Promise.all(to_solve).then(() => {\n return files;\n });\n }\n _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][1](data);\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this.open_request['_connecting_process'][1](data);\n this._closeOpenRequest('_connecting_process');\n this._auto_reconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this._is_connected = true;\n this._is_conneting_process = false;\n this.open_request['_connecting_process'][0](data);\n this._closeOpenRequest('_connecting_process');\n } else if (['load', 'named_view', 'detail_view'].includes(data.type)) {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n data.args.data = this._parseServerRes(json_res);\n } else if (data.type === 'on_update' || data.type === 'on_create') {\n const json_res = JSON.parse(data.args.data);\n let obj = this._parseServerRes(json_res);\n let cb;\n if (data.type === 'on_create') {\n cb = this.on_create;\n } else {\n cb = this.on_update;\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.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n noOpenRequests() {\n return new Promise(resolve => {\n if (Object.keys(this.open_request).length === 0) {\n return resolve();\n }\n this._onNoOpenRequests.push(resolve);\n });\n }\n _closeOpenRequest(event_id) {\n delete this.open_request[event_id];\n if (Object.keys(this.open_request).length === 0) {\n this._onNoOpenRequests.forEach(x => x());\n this._onNoOpenRequests = [];\n }\n }\n _connectToServer() {\n return new Promise(resolve => {\n const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);\n this._is_connected = false;\n for (const [_key, value] of Object.entries(this.open_request)) {\n value[1](e);\n }\n this.open_request = {};\n setTimeout(() => {\n if (this._auto_reconnect) {\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._is_connected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.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.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n }\n _parseServerRes(res) {\n let updated = [];\n for (let json_data of res) {\n const pk = json_data.pk;\n const obj = this.byPk(pk);\n for (const [k, v] of Object.entries(json_data.fields)) {\n if (v && typeof v === 'object' && v['__is_sdc_model__']) {\n obj[k] = new SubModel(v['pk'], v['model']);\n } else {\n obj[k] = v;\n }\n }\n updated.push(obj);\n }\n if (this.values_list.length === 1) {\n this.values = this.values_list.at(-1);\n } else {\n this.values = {};\n }\n return updated;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEdBQUcsQ0FBQ3FCLENBQUMsQ0FBQyxHQUFHLElBQUlyTSxRQUFRLENBQUNzTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUVBLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDLE1BQU07VUFDTHRCLEdBQUcsQ0FBQ3FCLENBQUMsQ0FBQyxHQUFHQyxDQUFDO1FBQ1o7TUFDRjtNQUVBSCxPQUFPLENBQUNySSxJQUFJLENBQUNrSCxHQUFHLENBQUM7SUFDbkI7SUFFQSxJQUFJLElBQUksQ0FBQ3ZJLFdBQVcsQ0FBQ0wsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNqQyxJQUFJLENBQUNNLE1BQU0sR0FBRyxJQUFJLENBQUNELFdBQVcsQ0FBQzhFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUM3RSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCO0lBRUEsT0FBT3lKLE9BQU87RUFFaEI7QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzP2FkYmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthcHB9IGZyb20gJy4vc2RjX21haW4uanMnO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmNvbnN0IE1BWF9GSUxFX1VQTE9BRCA9IDI1MDAwO1xuXG5cbmNsYXNzIFN1Yk1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihwaywgbW9kZWwpIHtcbiAgICB0aGlzLnBrID0gcGs7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTREMgTW9kZWwgTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICovXG4gIHNldCBtb2RlbChtb2RlbCkge1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gIH1cblxuICBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHN1YiBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJucyB7TW9kZWx9XG4gICAqL1xuICBsb2FkKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTW9kZWwgaXMgbm90IHNldCEhXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wayBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5uZXdNb2RlbCh0aGlzLl9tb2RlbCwge3BrX19pbjogdGhpcy5wa30pO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5uZXdNb2RlbCh0aGlzLl9tb2RlbCwge3BrOiB0aGlzLnBrfSk7XG4gIH1cbn1cblxuY29uc3QgTW9kZWxQcm94eUhhbmRsZXIgPSB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV0gPz8gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICBpZiAoIXZhbHVlLnBrICYmIHZhbHVlLnBrICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBsZXQgbmV3VmFsO1xuICAgICAgaWYgKHZhbHVlLnBrIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgbmV3VmFsID0gdmFsdWUucGsuc2xpY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IG5ldyBOdW1iZXIodmFsdWUucGspO1xuICAgICAgfVxuICAgICAgbmV3VmFsLmxvYWQgPSB2YWx1ZS5sb2FkLmJpbmQodmFsdWUpO1xuICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKG9sZFZhbCBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgncGsnKSkge1xuICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlLnBrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvbGRWYWwucGsgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHBhcnNlX2hpZGRlbl9pbnB1dHModmFsdWUpIHtcblxuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cblxuICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdub25lJykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzSW50UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cblxuZXhwb3J0IGNsYXNzIE1vZGVsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbF9uYW1lIHtzdHJpbmd9XG4gICAqIEBwYXJhbSBtb2RlbF9xdWVyeSB7anNvbn1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsX25hbWUsIG1vZGVsX3F1ZXJ5ID0ge30pIHtcbiAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzID0gW107XG4gICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdGhpcy5tb2RlbF9uYW1lID0gbW9kZWxfbmFtZTtcbiAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gbW9kZWxfcXVlcnk7XG4gICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IHRydWU7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMub3Blbl9yZXF1ZXN0ID0ge307XG4gICAgdGhpcy5vbl91cGRhdGUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICB0aGlzLm9uX2NyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtX2lkID0gdXVpZHY0KCk7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgaWR4ID0gLTE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgKytpZHg7XG4gICAgICAgIGlmIChpZHggPCB0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRoaXMudmFsdWVzX2xpc3RbaWR4XSwgZG9uZTogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoO1xuICB9XG5cbiAgYnlQayhwaykge1xuICAgIGlmIChwayAhPT0gbnVsbCkge1xuICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICAgIHBrID0gLTE7XG4gICAgICB9XG4gICAgICBsZXQgZWxlbSA9IHRoaXMudmFsdWVzX2xpc3QuZmluZChlbG0gPT4gZWxtLnBrID09PSBwayk7XG4gICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgZWxlbSA9IG5ldyBQcm94eSh7cGs6IHBrfSwgTW9kZWxQcm94eUhhbmRsZXIpO1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0LnB1c2goZWxlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgcmV0dXJuIHtwazogcGt9O1xuXG4gIH1cblxuICBmaWx0ZXIobW9kZWxfcXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbF9xdWVyeSwgbW9kZWxfcXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgIGV2ZW50X3R5cGU6ICdsb2FkJyxcbiAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoZmlsdGVyID0ge30sIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy52aWV3KHtmaWx0ZXIsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCwgZXZlbnRfdHlwZTogJ2xpc3Rfdmlldyd9KVxuICB9XG5cbiAgdmlldyh7XG4gICAgICAgICB2aWV3TmFtZSA9ICdodG1sX2xpc3RfdGVtcGxhdGUnLFxuICAgICAgICAgZmlsdGVyID0ge30sXG4gICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICBldmVudF90eXBlID0gJ25hbWVkX3ZpZXcnXG4gICAgICAgfSkge1xuICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgZXZlbnRfdHlwZSxcbiAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgdmlld19uYW1lOiB2aWV3TmFtZSxcbiAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAkZGl2X2xpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgIGFwcC5yZWZyZXNoKCRkaXZfbGlzdCk7XG4gICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICB9XTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgfVxuXG4gIGRldGFpbFZpZXcocGsgPSBudWxsLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVfY29udGV4dCA9IHt9KSB7XG4gICAgcGsgPSBwayA/PyAtMTtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgbGV0IGxvYWRfcHJvbWlzZTtcbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggIT09IDApIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMuaXNDb25uZWN0ZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrID09PSAtMSkge1xuICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3RbMF0ucGtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgIGV2ZW50X3R5cGU6ICdkZXRhaWxfdmlldycsXG4gICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICBwayxcbiAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9saXN0KTtcbiAgICAgICAgY2JfcmVzb2x2ZSAmJiBjYl9yZXNvbHZlKGRhdGEpO1xuICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICB9XTtcblxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgfVxuXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgc3luY01vZGVsVG9Gb3JtKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgIH1cblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgcGsgPSAkKHRoaXMpLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICBsZXQgaW5zdGFuY2UgPSBudWxsO1xuICAgICAgaWYocGsgPT09IC0xICYmIChzZWxmLnZhbHVlcy5wayA9PT0gdW5kZWZpbmVkIHx8IHNlbGYudmFsdWVzLnBrID09PSAtMSkpIHtcbiAgICAgICAgaW5zdGFuY2UgPSBzZWxmLnZhbHVlcztcbiAgICAgIH0gZWxzZSBpZihwayAhPT0gdW5kZWZpbmVkICYmIHBrICE9PSBudWxsKSB7XG4gICAgICAgIGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgIH1cbiAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtX2l0ZW0gb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgICBsZXQgbmFtZSA9IGZvcm1faXRlbS5uYW1lO1xuICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnJykge1xuICAgICAgICAgIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgZm9ybV9pdGVtLmNoZWNrZWQgPSBpbnN0YW5jZVtuYW1lXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgIGlmKGluc3RhbmNlW25hbWVdIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gbmV3IERhdGFUcmFuc2ZlcigpO1xuICAgICAgICAgICAgICBjb250YWluZXIuaXRlbXMuYWRkKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICAgICAgZm9ybV9pdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGZvcm1faXRlbSkudmFsKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgc3luY0Zvcm0oJGZvcm1zKSB7XG4gICAgaWYgKCEkZm9ybXMgfHwgISRmb3Jtcy5oYXNDbGFzcyh0aGlzLmZvcm1faWQpKSB7XG4gICAgICAkZm9ybXMgPSAkKGAuJHt0aGlzLmZvcm1faWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGluc3RhbmNlcyA9IFtdO1xuXG4gICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0ICRmb3JtID0gJCh0aGlzKTtcbiAgICAgIGxldCBwayA9ICRmb3JtLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmb3JtX2l0ZW0ubmFtZTtcbiAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJycpIHtcbiAgICAgICAgICBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IHBhcnNlX2hpZGRlbl9pbnB1dHMoJChmb3JtX2l0ZW0pLnZhbCgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IGZvcm1faXRlbS5jaGVja2VkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBmb3JtX2l0ZW0uZmlsZXNbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gJChmb3JtX2l0ZW0pLnZhbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPD0gMSAmJiBpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52YWx1ZXMgPSBpbnN0YW5jZXMuYXQoLTEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZXM7XG5cbiAgfVxuXG4gIGNyZWF0ZUZvcm0oY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdj4nKTtcbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9nZXRGb3JtKG51bGwsICdjcmVhdGVfZm9ybScsIG51bGwsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2X2Zvcm07XG4gIH1cblxuICBlZGl0Rm9ybShwayA9IC0xLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmlzQ29ubmVjdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2PicpO1xuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrIDw9IC0xKSB7XG4gICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdC5hdChwaykucGs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2dldEZvcm0ocGssICdlZGl0X2Zvcm0nLCBudWxsLCAkZGl2X2Zvcm0sIGNiX3Jlc29sdmUsIGNiX3JlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdl9mb3JtO1xuICB9XG5cbiAgbmFtZWRGb3JtKHBrID0gLTEsIGZvcm1OYW1lLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmlzQ29ubmVjdGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2ICBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHBrIDw9IC0xKSB7XG4gICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdC5hdChwaykucGs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2dldEZvcm0ocGssICduYW1lZF9mb3JtJywgZm9ybU5hbWUsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2X2Zvcm07XG4gIH1cblxuXG4gIF9nZXRGb3JtKHBrLCBldmVudF90eXBlLCBmb3JtTmFtZSwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICBldmVudF90eXBlOiBldmVudF90eXBlLFxuICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgYXJnczoge1xuICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICBwazogcGssXG4gICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWVcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCB8fCBwayA9PT0gLTEgPyAnY3JlYXRlJyA6ICdlZGl0JztcblxuICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgbGV0ICRmb3JtID0gJGRpdl9mb3JtLmNsb3Nlc3QoJ2Zvcm0nKVxuICAgICAgICAuYWRkQ2xhc3MoYHNkYy1tb2RlbC0ke2NsYXNzTmFtZX0tZm9ybSBzZGMtbW9kZWwtZm9ybSAke3RoaXMuZm9ybV9pZH1gKVxuICAgICAgICAuZGF0YSgnbW9kZWwnLCB0aGlzKVxuICAgICAgICAuZGF0YSgnbW9kZWxfcGsnLCBwaylcbiAgICAgICAgLmRhdGEoJ2Zvcm1fbmFtZScsIGZvcm1OYW1lKTtcbiAgICAgIGlmICgkZm9ybS5sZW5ndGggPiAwICYmICEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoJ3NkY19zdWJtaXQnKSkge1xuICAgICAgICAkZm9ybS5hdHRyKCdzZGNfc3VibWl0JywgJ3N1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yJylcbiAgICAgIH1cblxuICAgICAgYXBwLnJlZnJlc2goJGRpdl9mb3JtKTtcbiAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICB9LCAocmVzKSA9PiB7XG4gICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgfV07XG4gIH1cblxuICBuZXcoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0ICRmb3JtID0gJCgnPGZvcm0+JykuYXBwZW5kKHRoaXMuY3JlYXRlRm9ybSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3luY0Zvcm1Ub01vZGVsKCRmb3JtKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgcmVqZWN0KSk7XG4gICAgfSlcbiAgfVxuXG4gIHNhdmUocGsgPSAtMSwgZnJvbU5hbWUgPSAnZWRpdF9mb3JtJykge1xuICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgIHBrID0gLTE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBsZXQgZWxlbV9saXN0O1xuICAgICAgaWYgKHBrID4gLTEpIHtcbiAgICAgICAgZWxlbV9saXN0ID0gW3RoaXMuYnlQayhwayldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbV9saXN0ID0gdGhpcy52YWx1ZXNfbGlzdDtcbiAgICAgIH1cbiAgICAgIGxldCBwX2xpc3QgPSBbXVxuICAgICAgZWxlbV9saXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcF9saXN0LnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICBldmVudF90eXBlOiAnc2F2ZScsXG4gICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgIGZvcm1fbmFtZTogZnJvbU5hbWUsXG4gICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGVsZW0sXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0eXBlb2YgcmVzLmRhdGEuaW5zdGFuY2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSkgOiByZXMuZGF0YS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwX2xpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlKHZhbHVlcyA9IHRoaXMudmFsdWVzKSB7XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZEZpbGVzKHZhbHVlcykudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZXM/LnBrID09PSAtMSkge1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgICAgICAgIHRoaXMudmFsdWVzID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSlbMF07XG4gICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlKHBrID0gLTEpIHtcbiAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICBwayA9IC0xO1xuICAgIH1cbiAgICBpZiAocGsgPT09IC0xKSBwayA9IHRoaXMudmFsdWVzPy5waztcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICBldmVudF90eXBlOiAnZGVsZXRlJyxcbiAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICBwazogcGtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc19jb25uZWN0ZWQpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgfHwgIXRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ10pIHtcbiAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddID0gWygpID0+IHtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9XVxuICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2NoZWNrQ29ubmVjdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbcmVzb2x2ZV9vcmlnaW4sIHJlamVjdF9vcmlnaW5dID0gdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXTtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFtcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlX29yaWdpbigpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0X29yaWdpbigpO1xuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICBkZWxldGUgdGhpc1snc29ja2V0J107XG4gICAgfVxuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBfcmVhZEZpbGVzKGVsZW0pIHtcbiAgICBsZXQgdG9fc29sdmUgPSBbXTtcbiAgICAxMDBcbiAgICBsZXQgZmlsZXMgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW0pKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHRvX3NvbHZlLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICgoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICAgIGxldCByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgIGxldCBudW1iZXJfb2ZfY2h1bmtzID0gcGFyc2VJbnQoTWF0aC5jZWlsKHJlc3VsdC5sZW5ndGggLyBNQVhfRklMRV9VUExPQUQpKTtcbiAgICAgICAgICAgICAgZmlsZXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfY2h1bmtzOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rOiByZXN1bHQuc2xpY2UoTUFYX0ZJTEVfVVBMT0FEICogaSwgTUFYX0ZJTEVfVVBMT0FEICogKGkgKyAxKSksXG4gICAgICAgICAgICAgICAgICAgIGlkeDogaSxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NodW5rczogbnVtYmVyX29mX2NodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodmFsdWUpO1xuICAgICAgICAgIH0pKGtleSwgdmFsdWUpO1xuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodG9fc29sdmUpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZpbGVzXG4gICAgfSk7XG4gIH1cblxuICBfb25NZXNzYWdlKGUpIHtcbiAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzFdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoJ3B1c2hFcnJvck1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddWzFdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KCdfY29ubmVjdGluZ19wcm9jZXNzJyk7XG4gICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoJ3B1c2hNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXVswXShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdCgnX2Nvbm5lY3RpbmdfcHJvY2VzcycpO1xuICAgICAgfSBlbHNlIGlmIChbJ2xvYWQnLCAnbmFtZWRfdmlldycsICdkZXRhaWxfdmlldyddLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcbiAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcbiAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcblxuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdvbl91cGRhdGUnIHx8IGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICBsZXQgb2JqID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvbl9yZXMpO1xuICAgICAgICBsZXQgY2I7XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25fY3JlYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiID0gdGhpcy5vbl91cGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjYihvYmopO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IG9iajtcblxuICAgICAgfVxuXG4gICAgICBsZXQgaW5zdGFuY2UgPSBkYXRhLmRhdGE/Lmluc3RhbmNlXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgZGF0YS5kYXRhLmluc3RhbmNlID0gSlNPTi5wYXJzZShkYXRhLmRhdGEuaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcGVuX3JlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF1bMF0oZGF0YSk7XG4gICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZGF0YS5ldmVudF9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9PcGVuUmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3Blbl9yZXF1ZXN0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5wdXNoKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgX2Nsb3NlT3BlblJlcXVlc3QoZXZlbnRfaWQpIHtcbiAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbZXZlbnRfaWRdO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5fcmVxdWVzdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9vbk5vT3BlblJlcXVlc3RzLmZvckVhY2goeCA9PiB4KCkpO1xuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cyA9IFtdO1xuICAgIH1cblxuICB9XG5cbiAgX2Nvbm5lY3RUb1NlcnZlcigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblxuICAgICAgY29uc3QgbW9kZWxfaWRlbnRpZmllciA9IGAke3RoaXMubW9kZWxfbmFtZX1gICsgKHRoaXMubW9kZWxfaWQgPiAwID8gYC8ke3RoaXMubW9kZWxfaWR9YCA6ICcnKTtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsX2lkZW50aWZpZXJ9YCk7XG4gICAgICB9XG5cblxuICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBTREMgTW9kZWwgKCR7dGhpcy5tb2RlbF9uYW1lfSwgJHt0aGlzLm1vZGVsX2lkfSkgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHlgKTtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wZW5fcmVxdWVzdCkpIHtcbiAgICAgICAgICB2YWx1ZVsxXShlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdCA9IHt9O1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9hdXRvX3JlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzX2Nvbm5lY3RlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuXG4gICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgX2NoZWNrQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgIGV2ZW50X3R5cGU6ICdjb25uZWN0JyxcbiAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG4gIH1cblxuICBfcGFyc2VTZXJ2ZXJSZXMocmVzKSB7XG4gICAgbGV0IHVwZGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBqc29uX2RhdGEgb2YgcmVzKSB7XG4gICAgICBjb25zdCBwayA9IGpzb25fZGF0YS5waztcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuYnlQayhwayk7XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhqc29uX2RhdGEuZmllbGRzKSkge1xuICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdlsnX19pc19zZGNfbW9kZWxfXyddKSB7XG4gICAgICAgICAgb2JqW2tdID0gbmV3IFN1Yk1vZGVsKHZbJ3BrJ10sIHZbJ21vZGVsJ10pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVkLnB1c2gob2JqKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXNfbGlzdC5hdCgtMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG5cbiAgfVxufSJdLCJuYW1lcyI6WyJhcHAiLCJ0cmlnZ2VyIiwidXVpZHY0IiwiTUFYX0ZJTEVfVVBMT0FEIiwiU3ViTW9kZWwiLCJjb25zdHJ1Y3RvciIsInBrIiwibW9kZWwiLCJfbW9kZWwiLCJsb2FkIiwiY29udHJvbGxlciIsIlR5cGVFcnJvciIsIkFycmF5IiwibmV3TW9kZWwiLCJwa19faW4iLCJNb2RlbFByb3h5SGFuZGxlciIsImdldCIsInRhcmdldCIsImtleSIsInZhbHVlIiwidW5kZWZpbmVkIiwibmV3VmFsIiwic2xpY2UiLCJOdW1iZXIiLCJiaW5kIiwic2V0Iiwib2xkVmFsIiwiaGFzT3duUHJvcGVydHkiLCJKU09OIiwicGFyc2UiLCJwYXJzZV9oaWRkZW5faW5wdXRzIiwiaXNGbG9hdFJlZyIsImlzSW50UmVnIiwiaXNCb29sUmVnIiwiaXNTdHJpbmdSZWciLCJ0b0xvd2VyQ2FzZSIsIm1hdGNoIiwicGFyc2VJbnQiLCJwYXJzZUZsb2F0Iiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiTW9kZWwiLCJtb2RlbF9uYW1lIiwibW9kZWxfcXVlcnkiLCJfb25Ob09wZW5SZXF1ZXN0cyIsInZhbHVlc19saXN0IiwidmFsdWVzIiwiX2lzX2Nvbm5lY3RlZCIsIl9pc19jb25uZXRpbmdfcHJvY2VzcyIsIl9hdXRvX3JlY29ubmVjdCIsInNvY2tldCIsIm9wZW5fcmVxdWVzdCIsIm9uX3VwZGF0ZSIsIm9uX2NyZWF0ZSIsImZvcm1faWQiLCJTeW1ib2wiLCJpdGVyYXRvciIsImlkeCIsIm5leHQiLCJkb25lIiwiYnlQayIsImlzTmFOIiwiZWxlbSIsImZpbmQiLCJlbG0iLCJQcm94eSIsInB1c2giLCJmaWx0ZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nvbm5lY3RlZCIsInRoZW4iLCJpZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2VuZCIsInN0cmluZ2lmeSIsImV2ZW50IiwiZXZlbnRfdHlwZSIsImV2ZW50X2lkIiwiYXJncyIsImxpc3RWaWV3IiwiY2JSZXNvbHZlIiwiY2JSZWplY3QiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ2aWV3Iiwidmlld05hbWUiLCIkZGl2X2xpc3QiLCIkIiwidmlld19uYW1lIiwidGVtcGxhdGVfY29udGV4dCIsImRhdGEiLCJhcHBlbmQiLCJodG1sIiwicmVmcmVzaCIsInJlcyIsImRldGFpbFZpZXciLCJjYl9yZXNvbHZlIiwiY2JfcmVqZWN0IiwibG9hZF9wcm9taXNlIiwic3luY0Zvcm1Ub01vZGVsIiwiJGZvcm1zIiwic3luY0Zvcm0iLCJzeW5jTW9kZWxUb0Zvcm0iLCJoYXNDbGFzcyIsInNlbGYiLCJlYWNoIiwiaW5zdGFuY2UiLCJmb3JtX2l0ZW0iLCJlbGVtZW50cyIsIm5hbWUiLCJ0eXBlIiwiY2hlY2tlZCIsIkZpbGUiLCJjb250YWluZXIiLCJEYXRhVHJhbnNmZXIiLCJpdGVtcyIsImFkZCIsImZpbGVzIiwidmFsIiwiaW5zdGFuY2VzIiwiJGZvcm0iLCJhdCIsImNyZWF0ZUZvcm0iLCIkZGl2X2Zvcm0iLCJfZ2V0Rm9ybSIsImVkaXRGb3JtIiwibmFtZWRGb3JtIiwiZm9ybU5hbWUiLCJmb3JtX25hbWUiLCJjbGFzc05hbWUiLCJjbG9zZXN0IiwiYWRkQ2xhc3MiLCJoYXNBdHRyaWJ1dGUiLCJhdHRyIiwibmV3Iiwic2F2ZSIsImZyb21OYW1lIiwiZWxlbV9saXN0IiwicF9saXN0IiwiZm9yRWFjaCIsIl9yZWFkRmlsZXMiLCJfcGFyc2VTZXJ2ZXJSZXMiLCJhbGwiLCJjcmVhdGUiLCJkZWxldGUiLCJfY29ubmVjdFRvU2VydmVyIiwiX2NoZWNrQ29ubmVjdGlvbiIsInJlc29sdmVfb3JpZ2luIiwicmVqZWN0X29yaWdpbiIsImNsb3NlIiwib25jbG9zZSIsImNsZWFuIiwidG9fc29sdmUiLCJlbnRyaWVzIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsIm9ubG9hZCIsImUiLCJyZXN1bHQiLCJudW1iZXJfb2ZfY2h1bmtzIiwiTWF0aCIsImNlaWwiLCJmaWxlX25hbWUiLCJmaWVsZF9uYW1lIiwiY29udGVudF9sZW5ndGgiLCJzaXplIiwiaSIsImNodW5rIiwiY29udGVudF90eXBlIiwib25lcnJvciIsInJlYWRBc0JpbmFyeVN0cmluZyIsIl9vbk1lc3NhZ2UiLCJpc19lcnJvciIsIl9jbG9zZU9wZW5SZXF1ZXN0IiwibXNnIiwiaGVhZGVyIiwiaW5jbHVkZXMiLCJqc29uX3JlcyIsIm9iaiIsImNiIiwibm9PcGVuUmVxdWVzdHMiLCJrZXlzIiwieCIsIm1vZGVsX2lkZW50aWZpZXIiLCJtb2RlbF9pZCIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJXZWJTb2NrZXQiLCJob3N0Iiwib25tZXNzYWdlIiwiY29uc29sZSIsImVycm9yIiwiX2tleSIsInNldFRpbWVvdXQiLCJlcnIiLCJvbm9wZW4iLCJ1cGRhdGVkIiwianNvbl9kYXRhIiwiayIsInYiLCJmaWVsZHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n\n}");
98
98
 
99
99
  /***/ }),
100
100
 
@@ -1 +1 @@
1
- var e={};let t;e.d=(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);const n=/(?<=^|,\s?)[^=\s,]+/g,r=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function o(){return new Promise(function(e){e()})}function s(e){return(e=(e=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)).replace(/[0-9]+/g,e=>`-${e}`)).replace(/^[-]/g,"")}function i(e){return e.replace(/-./g,e=>`${e[1].toUpperCase()}`)}const l=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach(t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))}),n=Object.getPrototypeOf(n)};function a(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",c,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function c(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function u(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function d(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16))}function h(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function p(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each(function(e){$(this).replaceWith(n[e])});let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each(function(){r=!1;let t=$(this),n=t.data("auto-id"),o=e.find(".form-group."+n);o.addClass("has-error"),o.find(".form-input-container").append(t.find(".alert-danger"))}),r}function f(e,t=[]){return Object.fromEntries(Object.entries(e).filter(([e,n])=>e!==L&&!t.includes(e)).map(([e,t])=>{if("string"==typeof t&&t.startsWith("SDC_JSON_MODEL=["))try{const{pk:n,fields:r}=JSON.parse(t.slice(16,-1));return[e,{...r,id:n,pk:n}]}catch{}return[e,t]}))}function m(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o=f(r,e);n=[];for(let t=0;t<e.length;t++){let o=e[t];r.hasOwnProperty(o)?n.push(r[o]):n.push("undefined")}return n.push(o),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let o=u(e[r],t);n.push(o)}return n}(r,n)}function g(e,t,o){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let s;var i;"function"==typeof e._on_init_params?s=e._on_init_params():s=(i=e.onInit.toString().replace(r,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(n)||[];let l=m(s,t,o._parentController);if(e.onInit.apply(o,l),o===e)for(let n in e._mixins)g(e._mixins[n],t,o)}const y=["onbeforeunload","onunload"],v=Object.keys(window).filter(e=>/^on/.test(e)&&!y.includes(e)).map(e=>e.slice(2));function w(e,t,n){let r;switch(e){case"mouseleave":case"mouseout":case"mouseenter":case"mousein":return r=document.elementFromPoint(t.clientX,t.clientY),n!==r&&!n.contains(r);default:return!0}}function O(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,o=!1,s=!1;for(e.stopImmediatePropagation=()=>s=!0,e.stopPropagation=()=>s=o=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i&&w(t,e,n[0])){if(!r&&(r=W(n),!r))return;for(;r;){if(i.split(" ").forEach(s=>{if(o)return;let i=null;if("function"==typeof s)i=s;else if("function"==typeof r[s])i=r[s];else if("string"==typeof s&&s.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[s.slice(11)],!i)return}i&&i.call(r,n,e)}),s)return;r=r._parentController}}if(o)return;n=n.parent()}return{res:!0}}function C(e){if(e._isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(t)&&e.find(t).each(function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const o=`this.event_${t}`;-1===r.indexOf(o)&&(r.push(o),e.attr(`sdc_${n}`,r.join(" ")))})}}let b=[],k={};function N(e,t){if(e){let n=i(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function P(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(k[t][1])).filter((e,t,n)=>n.indexOf(e)===t);let n=!0;for(;n;){n=!1;for(let t of e)for(let r of k[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(k[e][0]);let s=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach(e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t}),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return l(n,e),t.forEach(e=>{l(n,e)}),n}(k[n][0],...o));return s._tagName=n,N(e,s),s.$container=t,function(e,t){g(t,e,t)}(t,s),s}function S(e,t,n,r){if(b.includes(n)){let o=i(n);return window[o]||(window[o]=P(e,t,n,r)),window[o].$container=t,window[o]}return P(e,t,n,r)}function E(e,t){const n=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=B(e),e.contentUrl=t.url),Promise.all([D(e,t.args)]).then(function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null})}(e).then(t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||o()).then(()=>t)))}(e).then(function(t){return function(e,t){return K(e,t).then(function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then(function(){return t})}return t})}(e,t)}).then(()=>function(e,t){return Z(null,e,t)}(e,t)).catch(function(t){return K(e,t)});return e.load_async?Promise.resolve():n}function R(e){const t=function(e){let t=[];for(;e;)e._isEventsSet=!1,t.unshift(e),e=e._parentController;return t}(e.controller[0]),n=t.concat(e.controller.slice(1));for(let t of n)C(t),t.onRefresh(e.controller[0])}function x(e,t){let n=Boolean(e);return n?e.uuids.has(t._uuid)||(e.uuids.add(t._uuid),e.controller.push(t)):e={uuids:new Set([t._uuid]),controller:[t]},{isRunningProcess:n,refreshProcess:e}}let q={},F={};function j(e,t){return T(e),F.hasOwnProperty(e)?t[F[e]]?void q[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function T(e,t){t||(t=e),F[e]||(F[e]=t,q[e]=[])}function M(e){for(let t in q)if(q.hasOwnProperty(t))for(let n=q[t].length;n>=0;n--)e===q[t][n]&&q[t].splice(n,1)}function A(e){let t=Array.apply(null,arguments);if(e=t.shift(),!q.hasOwnProperty(e)||!F.hasOwnProperty(e))return o();let n=q[e],r=F[e],s=[];for(let e=0;e<n.length;e++){let o=n[e][r].apply(n[e],t);void 0!==o&&s.push(o)}return Promise.all(s)}let I={};const L="_controller_",J="_sdc_controller_";function U(e,t,n){if(!e)return[];let r=e.children(),o=[];return r.each(function(e,r){let s=$(r),i=s.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?o.push({tag:i[0],super:i.splice(1)||[],dom:s}):i[0].startsWith("this.")?s.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):o=o.concat(U(s,t,n))}),o}function D(e,t){const{contentUrl:n,_tagName:r,contentReload:o}=e;return n?I[r]?Promise.resolve(I[r]):(t.VERSION=_e.VERSION,t._method="content",$.get(n,t).then(function(e){return o||(I[r]=e),e}).catch(function(t){throw 301===t.status&&A("_RedirectOnView",t.responseJSON["url-link"]),"function"==typeof e.confirmPageLoaded&&A("navLoaded",{controller_name:()=>t.status}),`<sdc-error data-code="${t.status}">${t.responseText}</sdc-error>`})):Promise.resolve(!1)}function V(e,t,n=null){return t=t||e.data(L),H(_e.tagNames,e,t,n)}function B(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let n=function(e,t){return m(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let o=e._urlParams[r],s=RegExp("%\\("+o+"\\)\\w","gm");t=t.replace(s,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function W(e){return e.hasClass(J)?e.data(`${L}`):e.closest(`.${J}`).data(`${L}`)}function G(e,t,n,r,o){let s=e.data(L);return s?V(e,s,o):(s=S(r,e,t,n),e.data(L,s),e.addClass(J),E(s,o))}function K(e,t,n=null){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return V(e.$container,e,n)}function H(e,t,n,r){return new Promise(o=>{let s=U(t,e,n),i=s.length;if(0===i)return o();for(let e=0;e<s.length;e++)G(s[e].dom,s[e].tag,s[e].super,n,r).then(()=>{if(i--,0===i)return o()})})}function X({$element:e,id:t=[],parent:n=null}){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach(([n,r])=>{const o=e.attr(n)??r;o&&t.push(o)}),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,getRealParent:()=>n,getIdx:function(){return this.idx=Math.max(0,(this.getRealParent()?.getIdx()??-1)+e.index()+1),this.idx},op:null,parent:n};return r.getIdx.bind(r),[r].concat(e.contents().toArray().map(e=>X({$element:$(e),id:t.slice(),parent:r})).flat())}function z(e,t){const n=X({$element:t}),r=X({$element:e});n.map((e,t)=>e.idx=t),r.map((e,t)=>e.idx=t);const o=Math.max(...r.concat(n).map(e=>e.depth)),s=Y(n,r,o);let i=[];window.MAIN=t,window.OPS=s,s.forEach((e,t)=>{const{op:n,$element:r,idx:o}=e;if("keep_counterpart"===n.type){if(n.counterpart.getIdx()!==o){const t=e.getBefore();t?n.counterpart.$element.insertAfter(t.$element):e.getRealParent().$element.prepend(n.counterpart.$element)}!function(e,t){const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach(n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)}),[...r].forEach(t=>{t.name.startsWith("data")||e.attr(t.name)===t.value||e.attr(t.name,t.value)}),e.removeData(),Object.entries(t.data()).forEach(([t,n])=>{e.data(t,n)})}(n.counterpart.$element,r),r.hasClass(J)&&(r.data(L).$container=n.counterpart.$element,r.data(L,null)),i.push(r)}else if("delete"===n.type)r.safeRemove();else if("insert"===n.type){const{after:t,target:n}=e.op;t?r.insertAfter(t.$element):n&&n.$element.prepend(r)}}),i.forEach(e=>e.safeRemove())}function Y(e,t,n){return t.filter(e=>e.depth===n&&!e.op).forEach(t=>{const n=e.find(e=>!e.op&&e.id===t.id);if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},t=t.parent,n=n.parent,!t||t.op||n?.op||e(t,n)};e(n,t)}}),n>1?Y(e,t,n-1):(e.forEach((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}}),t.forEach((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=1&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}}),[...e,...t].sort((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx)))}function Z(e,t,n=null){if(t||(t=W(e)),!t)return Promise.resolve();const{refreshProcess:r,isRunningProcess:o}=x(n,t);return e??=t.$container,H(_e.tagNames,e,t,n).then(()=>function(e,t,n){return function(e,t,n){const r=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each(function(){const t=$(this);let o;if(t.hasClass("_with_handler"))o=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(o=e[t])}if("function"==typeof o){const n=f(t.data());o=o.bind(e)(n)}o&&r.push(Promise.resolve(o).then(r=>{let o=$("<div></div>");return o.append(r),""===t.html()&&t.append("<div></div>"),_e.reconcile(e,o,t.children(),n)}))}),Promise.all(r)}(e,t??e.$container,n)}(t,e,r).then(()=>{o||R(r)}))}const Q=25e3;class ee{constructor(e,t){this.pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}load(e){if(!this._model)throw new TypeError("Model is not set!!");return this.pk instanceof Array?e.newModel(this._model,{pk__in:this.pk}):e.newModel(this._model,{pk:this.pk})}}const te={get(e,t){const n=e[t]??void 0;if(n instanceof ee){if(!n.pk&&0!==n.pk)return null;let e;return e=n.pk instanceof Array?n.pk.slice():new Number(n.pk),e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];if(r instanceof ee)if(n.hasOwnProperty("pk"))r.pk=n.pk;else try{r.pk=JSON.parse(n)}catch{r.pk=n}else e[t]=n}else e[t]=n;return!0}};function ne(e){return e.toLowerCase().match(/^(true|false)$/)?"true"===e.toLowerCase():"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substring(1,e.length-1):e:void 0}class re{constructor(e,t={}){this._onNoOpenRequests=[],this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=d()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){e=parseInt(e),isNaN(e)&&(e=-1);let t=this.values_list.find(t=>t.pk===e);return t||(t=new Proxy({pk:e},te),this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then(()=>{const e=d();return new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]})})}listView(e={},t=null,n=null,r={}){return this.view({filter:e,cbResolve:t,cbReject:n,templateContext:r,event_type:"list_view"})}view({viewName:e="html_list_template",filter:t={},cbResolve:n=null,cbReject:r=null,templateContext:o={},event_type:s="named_view"}){let i=$('<div class="container-fluid">');return this.isConnected().then(()=>{const l=d();this.socket.send(JSON.stringify({event:"model",event_type:s,event_id:l,args:{view_name:e,model_name:this.model_name,model_query:this.model_query,filter:t,template_context:o}})),this.open_request[l]=[e=>{i.append(e.html),_e.refresh(i),n&&n(e)},e=>{r&&r(e)}]}),i}detailView(e=null,t=null,n=null,r={}){e=e??-1,e=parseInt(e),isNaN(e)&&(e=-1);let o,s=$('<div class="container-fluid">');return o=0!==this.values_list.length?this.isConnected():this.load(),o.then(()=>{-1===e&&(e=this.values_list[0].pk);const o=d();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,pk:e,template_context:r}})),this.open_request[o]=[e=>{s.append(e.html),_e.refresh(s),t&&t(e)},e=>{n&&n(e)}]}),s}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each(function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}})}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each(function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=ne($(e).val()):"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}return n.push(r),r}),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$("<div>");return this.isConnected().then(()=>{this._getForm(null,"create_form",null,n,e,t)}),n}editForm(e=-1,t=null,n=null){let r;e=parseInt(e),isNaN(e)&&(e=-1),r=0!==this.values_list.length?this.isConnected():this.load();let o=$("<div>");return r.then(()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,o,t,n)}),o}namedForm(e=-1,t,n=null,r=null){let o;e=parseInt(e),isNaN(e)&&(e=-1),o=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return o.then(()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,s,n,r)}),s}_getForm(e,t,n,r,o,s){e=parseInt(e),isNaN(e)&&(e=-1);const i=d();this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:i,args:{model_name:this.model_name,model_query:this.model_query,pk:e,form_name:n}}));const l=null===e||-1===e?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let s=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e).data("form_name",n);s.length>0&&!s[0].hasAttribute("sdc_submit")&&s.attr("sdc_submit","submitModelFormDistributor"),_e.refresh(r),o&&o(t)},e=>{s&&s(e)}]}new(){return new Promise((e,t)=>{const n=$("<form>").append(this.createForm(()=>{this.syncFormToModel(n),e()},t))})}save(e=-1,t="edit_form"){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then(()=>{let n;n=e>-1?[this.byPk(e)]:this.values_list;let r=[];return n.forEach(e=>{const n=d();r.push(new Promise((r,o)=>{this._readFiles(e).then(s=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:n,args:{form_name:t,model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[n]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),r(e)},o]})}))}),Promise.all(r)})}create(e=this.values){const t=d();return this.isConnected().then(()=>new Promise((n,r)=>{this._readFiles(e).then(o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;-1===this.values?.pk&&(this.values_list=[],this.values=null),e.data.instance=this._parseServerRes(t)[0],n(e)},r]})}))}delete(e=-1){e=parseInt(e),isNaN(e)&&(e=-1),-1===e&&(e=this.values?.pk);const t=d();return this.isConnected().then(()=>new Promise((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))}isConnected(){return new Promise((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process&&this.open_request._connecting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then(()=>{e(this._checkConnection())})})}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,o]of Object.entries(e))o instanceof File&&t.push(new Promise((e,t)=>{((r,o)=>{let s=new FileReader;s.onload=s=>{const i=d();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/Q));n[r]={id:i,file_name:o.name,field_name:r,content_length:o.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(Q*e,Q*(e+1)),idx:e,number_of_chunks:a,file_name:o.name,field_name:r,content_length:o.size,content_type:o.type,model_name:this.model_name,model_query:this.model_query}}))},s.onerror=()=>{t()},s.readAsBinaryString(o)})(r,o)}));return Promise.all(t).then(()=>n)}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&A("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),this._closeOpenRequest("_connecting_process"),this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&A("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),this._closeOpenRequest("_connecting_process");else if(["load","named_view","detail_view"].includes(t.type)){const e=JSON.parse(t.args.data);this.values_list=[],t.args.data=this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r),t.args.data=r}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise(e=>{if(0===Object.keys(this.open_request).length)return e();this._onNoOpenRequests.push(e)})}_closeOpenRequest(e){delete this.open_request[e],0===Object.keys(this.open_request).length&&(this._onNoOpenRequests.forEach(e=>e()),this._onNoOpenRequests=[])}_connectToServer(){return new Promise(e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout(()=>{this._auto_reconnect&&this._connectToServer().then(()=>{})},1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}})}_checkConnection(){const e=d();return new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]})}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))t&&"object"==typeof t&&t.__is_sdc_model__?r[e]=new ee(t.pk,t.model):r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}let oe=!1,se=!1,ie=null,le={};function ae(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise(e=>oe?e():se?void setTimeout(()=>{ae().then(()=>{e()})},200):e(ue())):Promise.resolve(!0)}function ce(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(oe){oe=!1;try{ie.close()}catch(e){}}}()}function ue(){return se=!0,new Promise(e=>{ie="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),ie.onmessage=function(e){de(JSON.parse(e.data))},ie.onclose=function(){oe&&console.error("SDC Socket closed unexpectedly"),oe=!1;for(const[e,t]of Object.entries(le))t[1]({}),delete le[e];setTimeout(()=>{ue()},1e3)},ie.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),oe)try{ie.close()}catch(e){}},ie.onopen=function(){oe=!0,se=!1,e()}})}function de(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&A("pushErrorMsg",e.header||"",e.msg||""),e.id&&le[e.id]&&(le[e.id][1](e.data||null),delete le[e.id]);else if((e.msg||e.header)&&A("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type)e.id&&le[e.id]&&(le[e.id][0](e.data),delete le[e.id]);else if(e.type&&"sdc_event"===e.type){let t=e.event;t&&A(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&A("onNavLink",e.link)}class he{constructor(){this._uuid=d(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName=Object.getPrototypeOf(this)._tagName??"",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){_e.DEBUG&&!this._isMixin&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let o=this._mixins[r];"function"==typeof o[e]&&n.push(o[e].apply(this,t))}return Promise.all(n).then(()=>{this._isMixin=!1})}}onInit(){_e.DEBUG&&!this._isMixin&&console.DEBUG(Array.apply(null,arguments),this._tagName)}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map(e=>e.noOpenRequests()))}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){M(this);const e=i(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,e=>` ${e[1].toUpperCase()}`).replace(/^./g,e=>`${e.toUpperCase()}`)}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge(...e)}post(e,t){return _e.post(this,e,t)}get(e,t){return _e.get(this,e,t)}submitForm(e,t,n){return _e.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,o){return window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let o=d();return ae().then(()=>{ie.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))}),new Promise((e,t)=>{le[o]=[e,t]})}(e,t,r,o):function(e,t,n){return"object"!=typeof n&&Array.isArray(n)&&null===n&&(n={arg0:n}),n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then(e=>{const t=e._return_data;return de(t),t}).catch(e=>{const t=e.responseJSON;throw t.is_error=!0,de(t),e})}(n,r,o)}(n[1],this._tagName,this.parsedContentUrl??this.contentUrl,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){if(e instanceof Number&&e.hasOwnProperty("load"))return e.load(this);if(e instanceof re)return e;const n=new re(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new re(e,t);return r.load().then(()=>{r.values|=n,r.save().then(()=>(r.close(),r.values))})}find(e){return this.$container.find(e)}refresh(){return _e.refresh(this.$container,this)}reload(){return _e.reloadController(this)}reconcile(e,t=null){return _e.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){let e=this._childController,t=[];for(let n in e)if(e.hasOwnProperty(n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let{model:r,form_name:o}=e.data();const s=r.syncForm(e);for(let t of s)n.push(new Promise((n,s)=>{let i;i=null!==t.pk&&t.pk>=0?r.save(t.pk,o):r.create(t),i.then(t=>{h(e),this.submit_model_form_success&&this.submit_model_form_success(t[0]);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(t[0]);n(t)}).catch(t=>{this.reconcile($(`<div class="container-fluid">${t.html}</div>`),e.find(".container-fluid").first()),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);s(t)})}))}return Promise.all(n).then(e=>Object.assign({},...e.flat()))}}const pe={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach(([e,t])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(pe[e.toLowerCase()]&&(e=pe[e.toLowerCase()]),n[0].setAttribute(e,t))}),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};let fe,_e={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:b,rootController:null,globalRootController:null,_isInit:!1,_origin_trigger:null,_globalControllerClasses:[],init_sdc:()=>{_e._isInit||(_e._isInit=!0,_e._origin_trigger?ce():(_e._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return v.includes(t)||(v.push(t),$(window).on(t,O)),_e._origin_trigger.call(this,e)},_e.updateJquery()),ae(),function(){const e=$(window);v.forEach(t=>{e.off(t).on(t,O)})}(),_e.rootController=_e.rootController||new he,_e.globalRootController=_e.globalRootController||new he),_e.tagNames=Object.keys(k);const e=$("<div></div>");b.forEach(t=>{const n=k[t][0];e.append(`<${n.prototype._tagName}></${n.prototype._tagName}>`)});const{refreshProcess:n}=x(null,_e.rootController);return H(_e.tagNames,e,_e.globalRootController,n).then(()=>H(_e.tagNames,(t||(t=$("body")),t),_e.rootController,n).then(e=>(R(n),e)))},updateJquery:()=>{$.fn.safeReplace=function(e){return _e.safeReplace($(this),e)},$.fn.safeEmpty=function(){return _e.safeEmpty($(this))},$.fn.safeRemove=function(){return _e.safeRemove($(this))}},controllerToTag:e=>s(e.name).replace(/-controller$/,""),registerGlobal:e=>{_e.register(e);let t=e.prototype._tagName;b.push(t)},cleanCache:()=>{I={}},register:(e,t=!1)=>{let n=_e.controllerToTag(e);return!k[n]||t?(k[n]=[e,[]],e.prototype._tagName=n,{addMixin:(...e)=>{for(let t of e){let e;"string"==typeof t?e=s(t):t&&(e=_e.controllerToTag(t)),k[n][1].push(e)}}}):{addMixin:(...e)=>{}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=_e.CSRF_TOKEN,_e.ajax(e,t,params,$.post)),get:(e,t,n)=>_e.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=_e.VERSION,n._method=n._method||"api";const o=new Promise((s,i)=>r(t,n).then((t,n,r)=>{s(t,n,r),"redirect"===t.status?A("onNavLink",t["url-link"]):o.then(()=>{_e.refresh(e.$container)})}).catch(i));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?A("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise((l,c)=>{a(o,n||t.action,r||t.method).then((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then(()=>{_e.refresh(e.$container,e)})}).catch((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):c(e,t,n)})});return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise((o,s)=>{a(r,t||e.action,n||e.method).then(o).catch(s)})},getController:e=>W(e),safeEmpty:e=>(e.children().each(function(e,t){let n=$(t);_e.safeRemove(n)}),e),safeReplace:(e,t)=>(t.insertBefore(e),_e.safeRemove(e)),safeRemove:e=>(e.each(function(){let e=$(this);e.data(`${L}`)&&e.data(`${L}`).remove()}),e.find(`.${J}`).each(function(){const e=$(this).data(`${L}`);e&&e.remove()}),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=B(e);return e.contentUrl=t.url,D(e,t.args)}return new Promise(e=>{e($())})}(e).then(t=>{let n=$(t);return _e.reconcile(e,n)}),reconcile:(e,t,n=null,r=null)=>{if(!n){let n=e.$container.clone().empty();n.data(L,null),n.removeClass(J),n.append(t),t=n}n=n??e.$container;const{refreshProcess:o,isRunningProcess:s}=x(r,e);return Z(t,e,o).then(()=>{var r;return z(t,n),(r=e)._childController={},r.find(`.${J}`).each(function(){const e=W($(this));e===r&&N(r,e)}),s||R(o),e})},refresh:(e,t)=>Z(e,t)},me=[];function ge(){if(!jest)throw new Error("JEST is not defined");0===me.length&&(fe=$.ajax.bind($),me.push(jest.spyOn($,"ajax")),me[0].mockImplementation(function(e){return fe(e).then(e=>e).catch(e=>e)}))}const ye=ce,ve={get_controller:async function(e,t={},n=""){ge();const r=$("body");_e.updateJquery(),r.safeEmpty();const o=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))o.data(e,n);const s=$("<div></div>").append(o);return r.append(s),_e._isInit=!1,_e.cleanCache(),await _e.init_sdc(),_e.getController(o)},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){ge();const n=$("body");_e.updateJquery(),n.safeEmpty().append(e),_e._isInit=!1,_e.cleanCache(),await _e.init_sdc();let r=_e.rootController.iterateAllChildren();if(!t)return r;const o=r[0].onRefresh,s=jest.spyOn(r[0],"onRefresh");return new Promise(e=>{s.mockImplementation(function(){s.mockRestore();const t=o.apply(r[0],arguments);return e(r),t})})}};export{he as AbstractSDC,M as allOff,_e as app,u as checkIfParamNumberBoolOrString,h as clearErrorsInForm,S as controllerFactory,j as on,E as runControlFlowFunctions,p as setErrorsInForm,T as setEvent,ye as socketReconnect,ve as test_utils,A as trigger};
1
+ var e={};let t;e.d=(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);const n=/(?<=^|,\s?)[^=\s,]+/g,r=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function o(){return new Promise(function(e){e()})}function s(e){return(e=(e=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)).replace(/[0-9]+/g,e=>`-${e}`)).replace(/^[-]/g,"")}function i(e){return e.replace(/-./g,e=>`${e[1].toUpperCase()}`)}const l=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach(t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))}),n=Object.getPrototypeOf(n)};function a(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",c,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function c(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function u(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function d(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16))}function h(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function p(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each(function(e){$(this).replaceWith(n[e])});let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each(function(){r=!1;let t=$(this),n=t.data("auto-id"),o=e.find(".form-group."+n);o.addClass("has-error"),o.find(".form-input-container").append(t.find(".alert-danger"))}),r}function f(e,t=[]){return Object.fromEntries(Object.entries(e).filter(([e,n])=>e!==L&&!t.includes(e)).map(([e,t])=>{if("string"==typeof t&&t.startsWith("SDC_JSON_MODEL=["))try{const{pk:n,fields:r}=JSON.parse(t.slice(16,-1));return[e,{...r,id:n,pk:n}]}catch{}return[e,t]}))}function m(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o=f(r,e);n=[];for(let t=0;t<e.length;t++){let o=e[t];r.hasOwnProperty(o)?n.push(r[o]):n.push("undefined")}return n.push(o),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let o=u(e[r],t);n.push(o)}return n}(r,n)}function g(e,t,o){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let s;var i;"function"==typeof e._on_init_params?s=e._on_init_params():s=(i=e.onInit.toString().replace(r,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(n)||[];let l=m(s,t,o._parentController);if(e.onInit.apply(o,l),o===e)for(let n in e._mixins)g(e._mixins[n],t,o)}const y=["onbeforeunload","onunload"],v=Object.keys(window).filter(e=>/^on/.test(e)&&!y.includes(e)).map(e=>e.slice(2));function w(e,t,n){let r;switch(e){case"mouseleave":case"mouseout":case"mouseenter":case"mousein":return r=document.elementFromPoint(t.clientX,t.clientY),n!==r&&!n.contains(r);default:return!0}}function O(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,o=!1,s=!1;for(e.stopImmediatePropagation=()=>s=!0,e.stopPropagation=()=>s=o=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i&&w(t,e,n[0])){if(!r&&(r=W(n),!r))return;for(;r;){if(i.split(" ").forEach(s=>{if(o)return;let i=null;if("function"==typeof s)i=s;else if("function"==typeof r[s])i=r[s];else if("string"==typeof s&&s.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[s.slice(11)],!i)return}i&&i.call(r,n,e)}),s)return;r=r._parentController}}if(o)return;n=n.parent()}return{res:!0}}function C(e){if(e._isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(t)&&e.find(t).each(function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const o=`this.event_${t}`;-1===r.indexOf(o)&&(r.push(o),e.attr(`sdc_${n}`,r.join(" ")))})}}let b=[],k={};function N(e,t){if(e){let n=i(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function P(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(k[t][1])).filter((e,t,n)=>n.indexOf(e)===t);let n=!0;for(;n;){n=!1;for(let t of e)for(let r of k[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(k[e][0]);let s=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach(e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t}),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return l(n,e),t.forEach(e=>{l(n,e)}),n}(k[n][0],...o));return s._tagName=n,N(e,s),s.$container=t,function(e,t){g(t,e,t)}(t,s),s}function S(e,t,n,r){if(b.includes(n)){let o=i(n);return window[o]||(window[o]=P(e,t,n,r)),window[o].$container=t,window[o]}return P(e,t,n,r)}function E(e,t){const n=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=B(e),e.contentUrl=t.url),Promise.all([D(e,t.args)]).then(function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null})}(e).then(t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||o()).then(()=>t)))}(e).then(function(t){return function(e,t){return K(e,t).then(function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then(function(){return t})}return t})}(e,t)}).then(()=>function(e,t){return Z(null,e,t)}(e,t)).catch(function(t){return K(e,t)});return e.load_async?Promise.resolve():n}function R(e){const t=function(e){let t=[];for(;e;)e._isEventsSet=!1,t.unshift(e),e=e._parentController;return t}(e.controller[0]),n=t.concat(e.controller.slice(1));for(let t of n)C(t),t.onRefresh(e.controller[0])}function x(e,t){let n=Boolean(e);return n?e.uuids.has(t._uuid)||(e.uuids.add(t._uuid),e.controller.push(t)):e={uuids:new Set([t._uuid]),controller:[t]},{isRunningProcess:n,refreshProcess:e}}let q={},F={};function j(e,t){return T(e),F.hasOwnProperty(e)?t[F[e]]?void q[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function T(e,t){t||(t=e),F[e]||(F[e]=t,q[e]=[])}function M(e){for(let t in q)if(q.hasOwnProperty(t))for(let n=q[t].length;n>=0;n--)e===q[t][n]&&q[t].splice(n,1)}function A(e){let t=Array.apply(null,arguments);if(e=t.shift(),!q.hasOwnProperty(e)||!F.hasOwnProperty(e))return o();let n=q[e],r=F[e],s=[];for(let e=0;e<n.length;e++){let o=n[e][r].apply(n[e],t);void 0!==o&&s.push(o)}return Promise.all(s)}let I={};const L="_controller_",J="_sdc_controller_";function U(e,t,n){if(!e)return[];let r=e.children(),o=[];return r.each(function(e,r){let s=$(r),i=s.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?o.push({tag:i[0],super:i.splice(1)||[],dom:s}):i[0].startsWith("this.")?s.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):o=o.concat(U(s,t,n))}),o}function D(e,t){const{contentUrl:n,_tagName:r,contentReload:o}=e;return n?I[r]?Promise.resolve(I[r]):(t.VERSION=_e.VERSION,t._method="content",$.get(n,t).then(function(e){return o||(I[r]=e),e}).catch(function(t){throw 301===t.status&&A("_RedirectOnView",t.responseJSON["url-link"]),"function"==typeof e.confirmPageLoaded&&A("navLoaded",{controller_name:()=>t.status}),`<sdc-error data-code="${t.status}">${t.responseText}</sdc-error>`})):Promise.resolve(!1)}function V(e,t,n=null){return t=t||e.data(L),H(_e.tagNames,e,t,n)}function B(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let n=function(e,t){return m(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let o=e._urlParams[r],s=RegExp("%\\("+o+"\\)\\w","gm");t=t.replace(s,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function W(e){return e.hasClass(J)?e.data(`${L}`):e.closest(`.${J}`).data(`${L}`)}function G(e,t,n,r,o){let s=e.data(L);return s?V(e,s,o):(s=S(r,e,t,n),e.data(L,s),e.addClass(J),E(s,o))}function K(e,t,n=null){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return V(e.$container,e,n)}function H(e,t,n,r){return new Promise(o=>{let s=U(t,e,n),i=s.length;if(0===i)return o();for(let e=0;e<s.length;e++)G(s[e].dom,s[e].tag,s[e].super,n,r).then(()=>{if(i--,0===i)return o()})})}function X({$element:e,id:t=[],parent:n=null}){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach(([n,r])=>{const o=e.attr(n)??r;o&&t.push(o)}),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,getRealParent:()=>n,getIdx:function(){return this.idx=Math.max(0,(this.getRealParent()?.getIdx()??-1)+e.index()+1),this.idx},op:null,parent:n};return r.getIdx.bind(r),[r].concat(e.contents().toArray().map(e=>X({$element:$(e),id:t.slice(),parent:r})).flat())}function z(e,t){const n=X({$element:t}),r=X({$element:e});n.map((e,t)=>e.idx=t),r.map((e,t)=>e.idx=t);const o=Math.max(...r.concat(n).map(e=>e.depth)),s=Y(n,r,o);let i=[];window.MAIN=t,window.OPS=s,s.forEach((e,t)=>{const{op:n,$element:r,idx:o}=e;if("keep_counterpart"===n.type){if(n.counterpart.getIdx()!==o){const t=e.getBefore();t?n.counterpart.$element.insertAfter(t.$element):e.getRealParent().$element.prepend(n.counterpart.$element)}!function(e,t){const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach(n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)}),[...r].forEach(t=>{t.name.startsWith("data")||e.attr(t.name)===t.value||e.attr(t.name,t.value)}),e.removeData(),Object.entries(t.data()).forEach(([t,n])=>{e.data(t,n)})}(n.counterpart.$element,r),r.hasClass(J)&&(r.data(L).$container=n.counterpart.$element,r.data(L,null)),i.push(r)}else if("delete"===n.type)r.safeRemove();else if("insert"===n.type){const{after:t,target:n}=e.op;t?r.insertAfter(t.$element):n&&n.$element.prepend(r)}}),i.forEach(e=>e.safeRemove())}function Y(e,t,n){return t.filter(e=>e.depth===n&&!e.op).forEach(t=>{const n=e.find(e=>!e.op&&e.id===t.id);if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},t=t.parent,n=n.parent,!t||t.op||n?.op||e(t,n)};e(n,t)}}),n>1?Y(e,t,n-1):(e.forEach((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}}),t.forEach((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=1&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}}),[...e,...t].sort((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx)))}function Z(e,t,n=null){if(t||(t=W(e)),!t)return Promise.resolve();const{refreshProcess:r,isRunningProcess:o}=x(n,t);return e??=t.$container,H(_e.tagNames,e,t,n).then(()=>function(e,t,n){return function(e,t,n){const r=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each(function(){const t=$(this);let o;if(t.hasClass("_with_handler"))o=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(o=e[t])}if("function"==typeof o){const n=f(t.data());o=o.bind(e)(n)}o&&r.push(Promise.resolve(o).then(r=>{let o=$("<div></div>");return o.append(r),""===t.html()&&t.append("<div></div>"),_e.reconcile(e,o,t.children(),n)}))}),Promise.all(r)}(e,t??e.$container,n)}(t,e,r).then(()=>{o||R(r)}))}const Q=25e3;class ee{constructor(e,t){this.pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}load(e){if(!this._model)throw new TypeError("Model is not set!!");return this.pk instanceof Array?e.newModel(this._model,{pk__in:this.pk}):e.newModel(this._model,{pk:this.pk})}}const te={get(e,t){const n=e[t]??void 0;if(n instanceof ee){if(!n.pk&&0!==n.pk)return null;let e;return e=n.pk instanceof Array?n.pk.slice():new Number(n.pk),e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];if(r instanceof ee)if(n.hasOwnProperty("pk"))r.pk=n.pk;else try{r.pk=JSON.parse(n)}catch{r.pk=n}else e[t]=n}else e[t]=n;return!0}};function ne(e){return e.toLowerCase().match(/^(true|false)$/)?"true"===e.toLowerCase():"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substring(1,e.length-1):e:void 0}class re{constructor(e,t={}){this._onNoOpenRequests=[],this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=d()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){e=parseInt(e),isNaN(e)&&(e=-1);let t=this.values_list.find(t=>t.pk===e);return t||(t=new Proxy({pk:e},te),this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then(()=>{const e=d();return new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]})})}listView(e={},t=null,n=null,r={}){return this.view({filter:e,cbResolve:t,cbReject:n,templateContext:r,event_type:"list_view"})}view({viewName:e="html_list_template",filter:t={},cbResolve:n=null,cbReject:r=null,templateContext:o={},event_type:s="named_view"}){let i=$('<div class="container-fluid">');return this.isConnected().then(()=>{const l=d();this.socket.send(JSON.stringify({event:"model",event_type:s,event_id:l,args:{view_name:e,model_name:this.model_name,model_query:this.model_query,filter:t,template_context:o}})),this.open_request[l]=[e=>{i.append(e.html),_e.refresh(i),n&&n(e)},e=>{r&&r(e)}]}),i}detailView(e=null,t=null,n=null,r={}){e=e??-1,e=parseInt(e),isNaN(e)&&(e=-1);let o,s=$('<div class="container-fluid">');return o=0!==this.values_list.length?this.isConnected():this.load(),o.then(()=>{-1===e&&(e=this.values_list[0].pk);const o=d();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,pk:e,template_context:r}})),this.open_request[o]=[e=>{s.append(e.html),_e.refresh(s),t&&t(e)},e=>{n&&n(e)}]}),s}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each(function(){let e=$(this).data("model_pk"),n=null;if(-1!==e||void 0!==t.values.pk&&-1!==t.values.pk?null!=e&&(n=t.byPk(e)):n=t.values,n)for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type){if(n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}}else $(e).val(n[t])}})}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each(function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=ne($(e).val()):"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}return n.push(r),r}),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$("<div>");return this.isConnected().then(()=>{this._getForm(null,"create_form",null,n,e,t)}),n}editForm(e=-1,t=null,n=null){let r;e=parseInt(e),isNaN(e)&&(e=-1),r=0!==this.values_list.length?this.isConnected():this.load();let o=$("<div>");return r.then(()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,o,t,n)}),o}namedForm(e=-1,t,n=null,r=null){let o;e=parseInt(e),isNaN(e)&&(e=-1),o=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return o.then(()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,s,n,r)}),s}_getForm(e,t,n,r,o,s){e=parseInt(e),isNaN(e)&&(e=-1);const i=d();this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:i,args:{model_name:this.model_name,model_query:this.model_query,pk:e,form_name:n}}));const l=null===e||-1===e?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let s=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e).data("form_name",n);s.length>0&&!s[0].hasAttribute("sdc_submit")&&s.attr("sdc_submit","submitModelFormDistributor"),_e.refresh(r),o&&o(t)},e=>{s&&s(e)}]}new(){return new Promise((e,t)=>{const n=$("<form>").append(this.createForm(()=>{this.syncFormToModel(n),e()},t))})}save(e=-1,t="edit_form"){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then(()=>{let n;n=e>-1?[this.byPk(e)]:this.values_list;let r=[];return n.forEach(e=>{const n=d();r.push(new Promise((r,o)=>{this._readFiles(e).then(s=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:n,args:{form_name:t,model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[n]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),r(e)},o]})}))}),Promise.all(r)})}create(e=this.values){const t=d();return this.isConnected().then(()=>new Promise((n,r)=>{this._readFiles(e).then(o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;-1===this.values?.pk&&(this.values_list=[],this.values=null),e.data.instance=this._parseServerRes(t)[0],n(e)},r]})}))}delete(e=-1){e=parseInt(e),isNaN(e)&&(e=-1),-1===e&&(e=this.values?.pk);const t=d();return this.isConnected().then(()=>new Promise((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))}isConnected(){return new Promise((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process&&this.open_request._connecting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then(()=>{e(this._checkConnection())})})}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,o]of Object.entries(e))o instanceof File&&t.push(new Promise((e,t)=>{((r,o)=>{let s=new FileReader;s.onload=s=>{const i=d();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/Q));n[r]={id:i,file_name:o.name,field_name:r,content_length:o.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(Q*e,Q*(e+1)),idx:e,number_of_chunks:a,file_name:o.name,field_name:r,content_length:o.size,content_type:o.type,model_name:this.model_name,model_query:this.model_query}}))},s.onerror=()=>{t()},s.readAsBinaryString(o)})(r,o)}));return Promise.all(t).then(()=>n)}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&A("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),this._closeOpenRequest("_connecting_process"),this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&A("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),this._closeOpenRequest("_connecting_process");else if(["load","named_view","detail_view"].includes(t.type)){const e=JSON.parse(t.args.data);this.values_list=[],t.args.data=this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r),t.args.data=r}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise(e=>{if(0===Object.keys(this.open_request).length)return e();this._onNoOpenRequests.push(e)})}_closeOpenRequest(e){delete this.open_request[e],0===Object.keys(this.open_request).length&&(this._onNoOpenRequests.forEach(e=>e()),this._onNoOpenRequests=[])}_connectToServer(){return new Promise(e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout(()=>{this._auto_reconnect&&this._connectToServer().then(()=>{})},1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}})}_checkConnection(){const e=d();return new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]})}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))t&&"object"==typeof t&&t.__is_sdc_model__?r[e]=new ee(t.pk,t.model):r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}let oe=!1,se=!1,ie=null,le={};function ae(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise(e=>oe?e():se?void setTimeout(()=>{ae().then(()=>{e()})},200):e(ue())):Promise.resolve(!0)}function ce(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(oe){oe=!1;try{ie.close()}catch(e){}}}()}function ue(){return se=!0,new Promise(e=>{ie="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),ie.onmessage=function(e){de(JSON.parse(e.data))},ie.onclose=function(){oe&&console.error("SDC Socket closed unexpectedly"),oe=!1;for(const[e,t]of Object.entries(le))t[1]({}),delete le[e];setTimeout(()=>{ue()},1e3)},ie.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),oe)try{ie.close()}catch(e){}},ie.onopen=function(){oe=!0,se=!1,e()}})}function de(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&A("pushErrorMsg",e.header||"",e.msg||""),e.id&&le[e.id]&&(le[e.id][1](e.data||null),delete le[e.id]);else if((e.msg||e.header)&&A("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type)e.id&&le[e.id]&&(le[e.id][0](e.data),delete le[e.id]);else if(e.type&&"sdc_event"===e.type){let t=e.event;t&&A(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&A("onNavLink",e.link)}class he{constructor(){this._uuid=d(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName=Object.getPrototypeOf(this)._tagName??"",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){_e.DEBUG&&!this._isMixin&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let o=this._mixins[r];"function"==typeof o[e]&&n.push(o[e].apply(this,t))}return Promise.all(n).then(()=>{this._isMixin=!1})}}onInit(){_e.DEBUG&&!this._isMixin&&console.DEBUG(Array.apply(null,arguments),this._tagName)}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map(e=>e.noOpenRequests()))}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){M(this);const e=i(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,e=>` ${e[1].toUpperCase()}`).replace(/^./g,e=>`${e.toUpperCase()}`)}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge(...e)}post(e,t){return _e.post(this,e,t)}get(e,t){return _e.get(this,e,t)}submitForm(e,t,n){return _e.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,o){return window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let o=d();return ae().then(()=>{ie.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))}),new Promise((e,t)=>{le[o]=[e,t]})}(e,t,r,o):function(e,t,n){return"object"!=typeof n&&Array.isArray(n)&&null===n&&(n={arg0:n}),n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then(e=>{const t=e._return_data;return de(t),t}).catch(e=>{const t=e.responseJSON;throw t.is_error=!0,de(t),e})}(n,r,o)}(n[1],this._tagName,this.parsedContentUrl??this.contentUrl,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){if(e instanceof Number&&e.hasOwnProperty("load"))return e.load(this);if(e instanceof re)return e;const n=new re(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new re(e,t);return r.load().then(()=>{r.values|=n,r.save().then(()=>(r.close(),r.values))})}find(e){return this.$container.find(e)}refresh(){return _e.refresh(this.$container,this)}reload(){return _e.reloadController(this)}reconcile(e,t=null){return _e.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){let e=this._childController,t=[];for(let n in e)if(e.hasOwnProperty(n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let{model:r,form_name:o}=e.data();const s=r.syncForm(e);for(let t of s)n.push(new Promise((n,s)=>{let i;i=null!==t.pk&&t.pk>=0?r.save(t.pk,o):r.create(t),i.then(t=>{h(e),this.submit_model_form_success&&this.submit_model_form_success(t[0]);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(t[0]);n(t)}).catch(t=>{this.reconcile($(`<div class="container-fluid">${t.html}</div>`),e.find(".container-fluid").first()),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);s(t)})}))}return Promise.all(n).then(e=>Object.assign({},...e.flat()))}}const pe={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach(([e,t])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(pe[e.toLowerCase()]&&(e=pe[e.toLowerCase()]),n[0].setAttribute(e,t))}),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};let fe,_e={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:b,rootController:null,globalRootController:null,_isInit:!1,_origin_trigger:null,_globalControllerClasses:[],init_sdc:()=>{_e._isInit||(_e._isInit=!0,_e._origin_trigger?ce():(_e._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return v.includes(t)||(v.push(t),$(window).on(t,O)),_e._origin_trigger.call(this,e)},_e.updateJquery()),ae(),function(){const e=$(window);v.forEach(t=>{e.off(t).on(t,O)})}(),_e.rootController=_e.rootController||new he,_e.globalRootController=_e.globalRootController||new he),_e.tagNames=Object.keys(k);const e=$("<div></div>");b.forEach(t=>{const n=k[t][0];e.append(`<${n.prototype._tagName}></${n.prototype._tagName}>`)});const{refreshProcess:n}=x(null,_e.rootController);return H(_e.tagNames,e,_e.globalRootController,n).then(()=>H(_e.tagNames,(t||(t=$("body")),t),_e.rootController,n).then(e=>(R(n),e)))},updateJquery:()=>{$.fn.safeReplace=function(e){return _e.safeReplace($(this),e)},$.fn.safeEmpty=function(){return _e.safeEmpty($(this))},$.fn.safeRemove=function(){return _e.safeRemove($(this))}},controllerToTag:e=>s(e.name).replace(/-controller$/,""),registerGlobal:e=>{_e.register(e);let t=e.prototype._tagName;b.push(t)},cleanCache:()=>{I={}},register:(e,t=!1)=>{let n=_e.controllerToTag(e);return!k[n]||t?(k[n]=[e,[]],e.prototype._tagName=n,{addMixin:(...e)=>{for(let t of e){let e;"string"==typeof t?e=s(t):t&&(e=_e.controllerToTag(t)),k[n][1].push(e)}}}):{addMixin:(...e)=>{}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=_e.CSRF_TOKEN,_e.ajax(e,t,params,$.post)),get:(e,t,n)=>_e.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=_e.VERSION,n._method=n._method||"api";const o=new Promise((s,i)=>r(t,n).then((t,n,r)=>{s(t,n,r),"redirect"===t.status?A("onNavLink",t["url-link"]):o.then(()=>{_e.refresh(e.$container)})}).catch(i));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?A("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise((l,c)=>{a(o,n||t.action,r||t.method).then((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then(()=>{_e.refresh(e.$container,e)})}).catch((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):c(e,t,n)})});return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise((o,s)=>{a(r,t||e.action,n||e.method).then(o).catch(s)})},getController:e=>W(e),safeEmpty:e=>(e.children().each(function(e,t){let n=$(t);_e.safeRemove(n)}),e),safeReplace:(e,t)=>(t.insertBefore(e),_e.safeRemove(e)),safeRemove:e=>(e.each(function(){let e=$(this);e.data(`${L}`)&&e.data(`${L}`).remove()}),e.find(`.${J}`).each(function(){const e=$(this).data(`${L}`);e&&e.remove()}),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=B(e);return e.contentUrl=t.url,D(e,t.args)}return new Promise(e=>{e($())})}(e).then(t=>{let n=$(t);return _e.reconcile(e,n)}),reconcile:(e,t,n=null,r=null)=>{if(!n){let n=e.$container.clone().empty();n.data(L,null),n.removeClass(J),n.append(t),t=n}n=n??e.$container;const{refreshProcess:o,isRunningProcess:s}=x(r,e);return Z(t,e,o).then(()=>{var r;return z(t,n),(r=e)._childController={},r.find(`.${J}`).each(function(){const e=W($(this));e===r&&N(r,e)}),s||R(o),e})},refresh:(e,t)=>Z(e,t)},me=[];function ge(){if(!jest)throw new Error("JEST is not defined");0===me.length&&(fe=$.ajax.bind($),me.push(jest.spyOn($,"ajax")),me[0].mockImplementation(function(e){return fe(e).then(e=>e).catch(e=>e)}))}const ye=ce,ve={get_controller:async function(e,t={},n=""){ge();const r=$("body");_e.updateJquery(),r.safeEmpty();const o=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))o.data(e,n);const s=$("<div></div>").append(o);return r.append(s),_e._isInit=!1,_e.cleanCache(),await _e.init_sdc(),_e.getController(o)},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){ge();const n=$("body");_e.updateJquery(),n.safeEmpty().append(e),_e._isInit=!1,_e.cleanCache(),await _e.init_sdc();let r=_e.rootController.iterateAllChildren();if(!t)return r;const o=r[0].onRefresh,s=jest.spyOn(r[0],"onRefresh");return new Promise(e=>{s.mockImplementation(function(){s.mockRestore();const t=o.apply(r[0],arguments);return e(r),t})})}};export{he as AbstractSDC,M as allOff,_e as app,u as checkIfParamNumberBoolOrString,h as clearErrorsInForm,S as controllerFactory,j as on,E as runControlFlowFunctions,p as setErrorsInForm,T as setEvent,ye as socketReconnect,ve as test_utils,A as trigger};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdc_client",
3
- "version": "0.58.5",
3
+ "version": "0.58.6",
4
4
  "description": "Simple Dom Control",
5
5
  "main": "dist/ugly.index.js",
6
6
  "type": "module",
@@ -289,20 +289,28 @@ export class Model {
289
289
 
290
290
  let self = this;
291
291
  $forms.each(function () {
292
- if (!this.hasAttribute('data-model_pk')) {
292
+ let pk = $(this).data('model_pk');
293
+ let instance = null;
294
+ if(pk === -1 && (self.values.pk === undefined || self.values.pk === -1)) {
295
+ instance = self.values;
296
+ } else if(pk !== undefined && pk !== null) {
297
+ instance = self.byPk(pk);
298
+ }
299
+ if (!instance) {
293
300
  return;
294
301
  }
295
- let pk = $(this).data('model_pk');
296
- let instance = self.byPk(pk);
302
+
297
303
  for (let form_item of this.elements) {
298
304
  let name = form_item.name;
299
305
  if (name && name !== '') {
300
306
  if (form_item.type === 'checkbox') {
301
307
  form_item.checked = instance[name];
302
- } else if (form_item.type === 'file' && instance[name] instanceof File) {
303
- let container = new DataTransfer();
304
- container.items.add(instance[name]);
305
- form_item.files = container;
308
+ } else if (form_item.type === 'file') {
309
+ if(instance[name] instanceof File) {
310
+ let container = new DataTransfer();
311
+ container.items.add(instance[name]);
312
+ form_item.files = container;
313
+ }
306
314
  } else {
307
315
  $(form_item).val(instance[name]);
308
316
  }