sdc_client 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/ugly.index.js +1 -1
- package/package.json +1 -1
- package/src/simpleDomControl/sdc_socket.js +49 -24
package/dist/index.js
CHANGED
@@ -84,7 +84,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
84
84
|
\********************************************/
|
85
85
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
86
86
|
|
87
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model),\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\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\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nconst MAX_FILE_UPLOAD = 25000;\nlet OPEN_REQUESTS = {};\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 * SDC Model PK\n * @param {Number} pk\n */\n set pk(pk) {\n this._pk = pk;\n }\n get pk() {\n return this._pk;\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 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 const newVal = new Number(value.pk);\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 oldVal.pk = value;\n } else {\n target[key] = value;\n }\n } else {\n target[key] = value;\n }\n return true;\n }\n};\nfunction callServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(JSON.stringify({\n event: 'sdc_call',\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args\n }));\n });\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise(resolve => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\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 && data.type === 'sdc_recall') {\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === 'sdc_event') {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === 'sdc_redirect') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('onNavLink', data.link);\n }\n }\n };\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error('SDC Socket closed unexpectedly');\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n SDC_SOCKET.onerror = function (err) {\n console.error('Socket encountered error: ', err.message, 'Closing socket');\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\nfunction close() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\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}\nfunction isConnected() {\n return new Promise(resolve => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\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 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 = {}, cb_resolve = null, cb_reject = null) {\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: 'list_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n filter: filter\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 detailView(pk = -1, cb_resolve = null, cb_reject = null) {\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: pk\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 class=\"container-fluid\">');\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 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, '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 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 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 ? '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);\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) {\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 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 = JSON.parse(res.data.instance);\n 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 = JSON.parse(res.data.instance);\n this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\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) {\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 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 delete this.open_request[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 delete this.open_request['_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 delete this.open_request['_connecting_process'];\n } else if (data.type === 'load') {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n const obj = this._parseServerRes(json_res);\n data.args.data = obj;\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 if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n delete this.open_request[data.event_id];\n }\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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bXBsZURvbUNvbnRyb2wvc2RjX3NvY2tldC5qcz9hZGJjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwfSBmcm9tICcuL3NkY19tYWluLmpzJztcbmltcG9ydCB7dHJpZ2dlcn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuXG5sZXQgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG5sZXQgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xubGV0IFNEQ19TT0NLRVQgPSBudWxsXG5jb25zdCBNQVhfRklMRV9VUExPQUQgPSAyNTAwMDtcbmxldCBPUEVOX1JFUVVFU1RTID0ge307XG5cblxuY2xhc3MgU3ViTW9kZWwge1xuXG4gICAgY29uc3RydWN0b3IocGssIG1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3BrID0gcGs7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU0RDIE1vZGVsIE5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICAgKi9cbiAgICBzZXQgbW9kZWwobW9kZWwpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICB9XG5cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTREMgTW9kZWwgUEtcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcGtcbiAgICAgKi9cbiAgICBzZXQgcGsocGspIHtcbiAgICAgICAgdGhpcy5fcGsgPSBwaztcbiAgICB9XG5cbiAgICBnZXQgcGsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBzdWIgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAgICogQHJldHVybnMge01vZGVsfVxuICAgICAqL1xuICAgIGxvYWQoY29udHJvbGxlcikge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTW9kZWwgaXMgbm90IHNldCEhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm5ld01vZGVsKHRoaXMuX21vZGVsLCB7cGs6IHRoaXMuX3BrfSk7XG4gICAgfVxufVxuXG5jb25zdCBNb2RlbFByb3h5SGFuZGxlciA9IHtcbiAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRba2V5XSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICAgICAgICBpZighdmFsdWUucGsgJiYgdmFsdWUucGsgIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gbmV3IE51bWJlcih2YWx1ZS5wayk7XG4gICAgICAgICAgICBuZXdWYWwubG9hZCA9IHZhbHVlLmxvYWQuYmluZCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHNldCh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgICAgICAgaWYgKG9sZFZhbCBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICAgICAgICAgICAgb2xkVmFsLnBrID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBmdW5jTmFtZSwgYXJncykge1xuXG4gICAgbGV0IGlkID0gdXVpZHY0KCk7XG4gICAgaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgU0RDX1NPQ0tFVC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiAnc2RjX2NhbGwnLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgZnVuY3Rpb246IGZ1bmNOYW1lLFxuICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBPUEVOX1JFUVVFU1RTW2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgICBJU19DT05ORUNUSU5HID0gdHJ1ZTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgICAgICAgU0RDX1NPQ0tFVCA9IG5ldyBXZWJTb2NrZXQoYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgU0RDX1NPQ0tFVC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgICAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcigncHVzaE1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfcmVjYWxsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXVswXShkYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfZXZlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudCA9IGRhdGEuZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihldmVudCwgZGF0YS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSAnc2RjX3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBkYXRhLmxpbmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBTRENfU09DS0VULm9uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU0RDIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBJU19DT05ORUNURUQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKE9QRU5fUkVRVUVTVFMpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVbMV0oe30pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9jb25uZWN0KCk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBTRENfU09DS0VULm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTb2NrZXQgZW5jb3VudGVyZWQgZXJyb3I6ICcsIGVyci5tZXNzYWdlLCAnQ2xvc2luZyBzb2NrZXQnKTtcbiAgICAgICAgICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFNEQ19TT0NLRVQub25vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgSVNfQ09OTkVDVEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIElTX0NPTk5FQ1RJTkcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgU0RDX1NPQ0tFVC5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZV9oaWRkZW5faW5wdXRzKHZhbHVlKSB7XG5cbiAgICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICAgIGxldCBpc0Jvb2xSZWcgPSAvXih0cnVlfGZhbHNlKSQvO1xuICAgIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cblxuICAgIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKGlzQm9vbFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAodmFsdWUubWF0Y2goaXNJbnRSZWcpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25uZWN0ZWQoKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChJU19DT05ORUNUSU5HKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoX2Nvbm5lY3QoKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbF9uYW1lIHtzdHJpbmd9XG4gICAgICogQHBhcmFtIG1vZGVsX3F1ZXJ5IHtqc29ufVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsX25hbWUsIG1vZGVsX3F1ZXJ5ID0ge30pIHtcbiAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgICAgICB0aGlzLm1vZGVsX25hbWUgPSBtb2RlbF9uYW1lO1xuICAgICAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gbW9kZWxfcXVlcnk7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc19jb25uZXRpbmdfcHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IHRydWU7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3QgPSB7fTtcbiAgICAgICAgdGhpcy5vbl91cGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25fY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZm9ybV9pZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBsZXQgaWR4ID0gLTE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCA8IHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHRoaXMudmFsdWVzX2xpc3RbaWR4XSwgZG9uZTogZmFsc2V9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlc19saXN0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBieVBrKHBrKSB7XG4gICAgICAgIGlmIChwayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGVsZW0gPSB0aGlzLnZhbHVlc19saXN0LmZpbmQoZWxtID0+IGVsbS5wayA9PT0gcGspO1xuICAgICAgICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgICAgICAgICAgZWxlbSA9IG5ldyBQcm94eSh7cGs6IHBrfSwgTW9kZWxQcm94eUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzX2xpc3QucHVzaChlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7cGs6IHBrfTtcblxuICAgIH1cblxuICAgIGZpbHRlcihtb2RlbF9xdWVyeSkge1xuICAgICAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbF9xdWVyeSwgbW9kZWxfcXVlcnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RWaWV3KGZpbHRlciA9IHt9LCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgICAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2xpc3RfdmlldycsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2xpc3QpO1xuICAgICAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XTtcblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9saXN0O1xuICAgIH1cblxuICAgIGRldGFpbFZpZXcocGsgPSAtMSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICAgICAgbGV0ICRkaXZfbGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgICAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgICAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMuaXNDb25uZWN0ZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBrID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdFswXS5wa1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdkZXRhaWxfdmlldycsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHBrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAkZGl2X2xpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9saXN0KTtcbiAgICAgICAgICAgICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgICAgICAgICAgfV07XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgICB9XG5cbiAgICBzeW5jRm9ybVRvTW9kZWwoJGZvcm1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNGb3JtKCRmb3Jtcyk7XG4gICAgfVxuXG4gICAgc3luY01vZGVsVG9Gb3JtKCRmb3Jtcykge1xuICAgICAgICBpZiAoISRmb3JtcyB8fCAhJGZvcm1zLmhhc0NsYXNzKHRoaXMuZm9ybV9pZCkpIHtcbiAgICAgICAgICAgICRmb3JtcyA9ICQoYC4ke3RoaXMuZm9ybV9pZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1tb2RlbF9waycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBrID0gJCh0aGlzKS5kYXRhKCdtb2RlbF9waycpO1xuICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgICAgICAgIGZvciAobGV0IGZvcm1faXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBmb3JtX2l0ZW0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1faXRlbS5jaGVja2VkID0gaW5zdGFuY2VbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJyAmJiBpbnN0YW5jZVtuYW1lXSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaXRlbXMuYWRkKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1faXRlbS5maWxlcyA9IGNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZm9ybV9pdGVtKS52YWwoaW5zdGFuY2VbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgICAgICBpZiAoISRmb3JtcyB8fCAhJGZvcm1zLmhhc0NsYXNzKHRoaXMuZm9ybV9pZCkpIHtcbiAgICAgICAgICAgICRmb3JtcyA9ICQoYC4ke3RoaXMuZm9ybV9pZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgaW5zdGFuY2VzID0gW107XG5cbiAgICAgICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0ICRmb3JtID0gJCh0aGlzKTtcbiAgICAgICAgICAgIGxldCBwayA9ICRmb3JtLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGZvcm1faXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gcGFyc2VfaGlkZGVuX2lucHV0cygkKGZvcm1faXRlbSkudmFsKCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IGZvcm1faXRlbS5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gZm9ybV9pdGVtLmZpbGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSAkKGZvcm1faXRlbSkudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoIDw9IDEgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gaW5zdGFuY2VzLmF0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZXM7XG5cbiAgICB9XG5cbiAgICBjcmVhdGVGb3JtKGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2dldEZvcm0obnVsbCwgJ2NyZWF0ZV9mb3JtJywgbnVsbCwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9mb3JtO1xuICAgIH1cblxuICAgIGVkaXRGb3JtKHBrID0gLTEsIGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgICAgICBsb2FkX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGsgPD0gLTEpIHtcbiAgICAgICAgICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9nZXRGb3JtKHBrLCAnZWRpdF9mb3JtJywgbnVsbCwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9mb3JtO1xuICAgIH1cblxuICAgIG5hbWVkRm9ybShwayA9IC0xLCBmb3JtTmFtZSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICAgICAgbGV0IGxvYWRfcHJvbWlzZTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmlzQ29ubmVjdGVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2ICBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgICAgIGxvYWRfcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChwayA8PSAtMSkge1xuICAgICAgICAgICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdC5hdChwaykucGs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2dldEZvcm0ocGssICduYW1lZF9mb3JtJywgZm9ybU5hbWUsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICRkaXZfZm9ybTtcbiAgICB9XG5cblxuICAgIF9nZXRGb3JtKHBrLCBldmVudF90eXBlLCBmb3JtTmFtZSwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpIHtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50X3R5cGUsXG4gICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgIHBrOiBwayxcbiAgICAgICAgICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCA/ICdjcmVhdGUnIDogJ2VkaXQnO1xuXG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgbGV0ICRmb3JtID0gJGRpdl9mb3JtLmNsb3Nlc3QoJ2Zvcm0nKS5hZGRDbGFzcyhgc2RjLW1vZGVsLSR7Y2xhc3NOYW1lfS1mb3JtIHNkYy1tb2RlbC1mb3JtICR7dGhpcy5mb3JtX2lkfWApLmRhdGEoJ21vZGVsJywgdGhpcykuZGF0YSgnbW9kZWxfcGsnLCBwayk7XG4gICAgICAgICAgICBpZiAoJGZvcm0ubGVuZ3RoID4gMCAmJiAhJGZvcm1bMF0uaGFzQXR0cmlidXRlKCdzZGNfc3VibWl0JykpIHtcbiAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKCdzZGNfc3VibWl0JywgJ3N1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9mb3JtKTtcbiAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkZm9ybSA9ICQoJzxmb3JtPicpLmFwcGVuZCh0aGlzLmNyZWF0ZUZvcm0oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0Zvcm1Ub01vZGVsKCRmb3JtKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzYXZlKHBrID0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGVtX2xpc3Q7XG4gICAgICAgICAgICBpZiAocGsgPiAtMSkge1xuICAgICAgICAgICAgICAgIGVsZW1fbGlzdCA9IFt0aGlzLmJ5UGsocGspXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbV9saXN0ID0gdGhpcy52YWx1ZXNfbGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwX2xpc3QgPSBbXVxuICAgICAgICAgICAgZWxlbV9saXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICAgIHBfbGlzdC5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnc2F2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwX2xpc3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGUodmFsdWVzID0gdGhpcy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKHZhbHVlcykudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9LCByZWplY3RdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVsZXRlKHBrID0gLTEpIHtcbiAgICAgICAgaWYgKHBrID09PSAtMSkgcGsgPSB0aGlzLnZhbHVlcz8ucGtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrOiBwa1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNfY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc19jb25uZXRpbmdfcHJvY2VzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFsoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5fY2hlY2tDb25uZWN0aW9uKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcmVzb2x2ZV9vcmlnaW4sIHJlamVjdF9vcmlnaW5dID0gdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddID0gW1xuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX29yaWdpbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Rfb3JpZ2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b19yZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzWydzb2NrZXQnXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFuKCkge1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9yZWFkRmlsZXMoZWxlbSkge1xuICAgICAgICBsZXQgdG9fc29sdmUgPSBbXTtcbiAgICAgICAgbGV0IGZpbGVzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICB0b19zb2x2ZS5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgKChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtYmVyX29mX2NodW5rcyA9IHBhcnNlSW50KE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gTUFYX0ZJTEVfVVBMT0FEKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcl9vZl9jaHVua3M7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bms6IHJlc3VsdC5zbGljZShNQVhfRklMRV9VUExPQUQgKiBpLCBNQVhfRklMRV9VUExPQUQgKiAoaSArIDEpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHg6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NodW5rczogbnVtYmVyX29mX2NodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRvX3NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25NZXNzYWdlKGUpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuX3JlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShkYXRhKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddWzFdKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddO1xuICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcigncHVzaE1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddWzBdKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdsb2FkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25fcmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcbiAgICAgICAgICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IG9iajtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdvbl91cGRhdGUnIHx8IGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uX3JlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IG9iaiA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcbiAgICAgICAgICAgICAgICBsZXQgY2I7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnb25fY3JlYXRlJykge1xuICAgICAgICAgICAgICAgICAgICBjYiA9IHRoaXMub25fY3JlYXRlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNiID0gdGhpcy5vbl91cGRhdGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2Iob2JqKTtcbiAgICAgICAgICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IG9iajtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF1bMF0oZGF0YSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2Nvbm5lY3RUb1NlcnZlcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGVsX2lkZW50aWZpZXIgPSBgJHt0aGlzLm1vZGVsX25hbWV9YCArICh0aGlzLm1vZGVsX2lkID4gMCA/IGAvJHt0aGlzLm1vZGVsX2lkfWAgOiAnJyk7XG4gICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxfaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU0RDIE1vZGVsICgke3RoaXMubW9kZWxfbmFtZX0sICR7dGhpcy5tb2RlbF9pZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3Blbl9yZXF1ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVsxXShlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3QgPSB7fTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXV0b19yZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNfY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBfY2hlY2tDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcGFyc2VTZXJ2ZXJSZXMocmVzKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGpzb25fZGF0YSBvZiByZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBrID0ganNvbl9kYXRhLnBrXG4gICAgICAgICAgICBjb25zdCBvYmogPSB0aGlzLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoanNvbl9kYXRhLmZpZWxkcykpIHtcbiAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdlsnX19pc19zZGNfbW9kZWxfXyddKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IG5ldyBTdWJNb2RlbCh2WydwayddLCB2Wydtb2RlbCddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGVkLnB1c2gob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB0aGlzLnZhbHVlc19saXN0LmF0KC0xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcblxuICAgIH1cbn0iXSwibmFtZXMiOlsiYXBwIiwidHJpZ2dlciIsInV1aWR2NCIsIklTX0NPTk5FQ1RFRCIsIklTX0NPTk5FQ1RJTkciLCJTRENfU09DS0VUIiwiTUFYX0ZJTEVfVVBMT0FEIiwiT1BFTl9SRVFVRVNUUyIsIlN1Yk1vZGVsIiwiY29uc3RydWN0b3IiLCJwayIsIm1vZGVsIiwiX3BrIiwiX21vZGVsIiwibG9hZCIsImNvbnRyb2xsZXIiLCJUeXBlRXJyb3IiLCJuZXdNb2RlbCIsIk1vZGVsUHJveHlIYW5kbGVyIiwiZ2V0IiwidGFyZ2V0Iiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJuZXdWYWwiLCJOdW1iZXIiLCJiaW5kIiwic2V0Iiwib2xkVmFsIiwiY2FsbFNlcnZlciIsImZ1bmNOYW1lIiwiYXJncyIsImlkIiwiaXNDb25uZWN0ZWQiLCJ0aGVuIiwic2VuZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudCIsImZ1bmN0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJfY29ubmVjdCIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJXZWJTb2NrZXQiLCJob3N0Iiwib25tZXNzYWdlIiwiZSIsImRhdGEiLCJwYXJzZSIsImlzX2Vycm9yIiwibXNnIiwiaGVhZGVyIiwidHlwZSIsInBheWxvYWQiLCJsaW5rIiwib25jbG9zZSIsImNvbnNvbGUiLCJlcnJvciIsIk9iamVjdCIsImVudHJpZXMiLCJzZXRUaW1lb3V0Iiwib25lcnJvciIsImVyciIsIm1lc3NhZ2UiLCJjbG9zZSIsIm9ub3BlbiIsInBhcnNlX2hpZGRlbl9pbnB1dHMiLCJpc0Zsb2F0UmVnIiwiaXNJbnRSZWciLCJpc0Jvb2xSZWciLCJpc1N0cmluZ1JlZyIsInRvTG93ZXJDYXNlIiwibWF0Y2giLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJNb2RlbCIsIm1vZGVsX25hbWUiLCJtb2RlbF9xdWVyeSIsInZhbHVlc19saXN0IiwidmFsdWVzIiwiX2lzX2Nvbm5lY3RlZCIsIl9pc19jb25uZXRpbmdfcHJvY2VzcyIsIl9hdXRvX3JlY29ubmVjdCIsInNvY2tldCIsIm9wZW5fcmVxdWVzdCIsIm9uX3VwZGF0ZSIsIm9uX2NyZWF0ZSIsImZvcm1faWQiLCJTeW1ib2wiLCJpdGVyYXRvciIsImlkeCIsIm5leHQiLCJkb25lIiwiYnlQayIsImVsZW0iLCJmaW5kIiwiZWxtIiwiUHJveHkiLCJwdXNoIiwiZmlsdGVyIiwiYXNzaWduIiwiZXZlbnRfdHlwZSIsImV2ZW50X2lkIiwibGlzdFZpZXciLCJjYl9yZXNvbHZlIiwiY2JfcmVqZWN0IiwiJGRpdl9saXN0IiwiJCIsImFwcGVuZCIsImh0bWwiLCJyZWZyZXNoIiwicmVzIiwiZGV0YWlsVmlldyIsImxvYWRfcHJvbWlzZSIsInN5bmNGb3JtVG9Nb2RlbCIsIiRmb3JtcyIsInN5bmNGb3JtIiwic3luY01vZGVsVG9Gb3JtIiwiaGFzQ2xhc3MiLCJzZWxmIiwiZWFjaCIsImhhc0F0dHJpYnV0ZSIsImluc3RhbmNlIiwiZm9ybV9pdGVtIiwiZWxlbWVudHMiLCJuYW1lIiwiY2hlY2tlZCIsIkZpbGUiLCJjb250YWluZXIiLCJEYXRhVHJhbnNmZXIiLCJpdGVtcyIsImFkZCIsImZpbGVzIiwidmFsIiwiaW5zdGFuY2VzIiwiJGZvcm0iLCJhdCIsImNyZWF0ZUZvcm0iLCIkZGl2X2Zvcm0iLCJfZ2V0Rm9ybSIsImVkaXRGb3JtIiwibmFtZWRGb3JtIiwiZm9ybU5hbWUiLCJmb3JtX25hbWUiLCJjbGFzc05hbWUiLCJjbG9zZXN0IiwiYWRkQ2xhc3MiLCJhdHRyIiwibmV3Iiwic2F2ZSIsImVsZW1fbGlzdCIsInBfbGlzdCIsImZvckVhY2giLCJfcmVhZEZpbGVzIiwiX3BhcnNlU2VydmVyUmVzIiwiYWxsIiwiY3JlYXRlIiwiZGVsZXRlIiwiX2Nvbm5lY3RUb1NlcnZlciIsIl9jaGVja0Nvbm5lY3Rpb24iLCJyZXNvbHZlX29yaWdpbiIsInJlamVjdF9vcmlnaW4iLCJjbGVhbiIsInRvX3NvbHZlIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsIm9ubG9hZCIsInJlc3VsdCIsIm51bWJlcl9vZl9jaHVua3MiLCJNYXRoIiwiY2VpbCIsImZpbGVfbmFtZSIsImZpZWxkX25hbWUiLCJjb250ZW50X2xlbmd0aCIsInNpemUiLCJpIiwiY2h1bmsiLCJzbGljZSIsImNvbnRlbnRfdHlwZSIsInJlYWRBc0JpbmFyeVN0cmluZyIsIl9vbk1lc3NhZ2UiLCJoYXNPd25Qcm9wZXJ0eSIsImpzb25fcmVzIiwib2JqIiwiY2IiLCJtb2RlbF9pZGVudGlmaWVyIiwibW9kZWxfaWQiLCJfa2V5IiwidXBkYXRlZCIsImpzb25fZGF0YSIsImsiLCJ2IiwiZmllbGRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n");
|
87
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model),\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\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\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nconst MAX_FILE_UPLOAD = 25000;\nlet OPEN_REQUESTS = {};\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 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 const newVal = new Number(value.pk);\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 oldVal.pk = value;\n }\n } else {\n target[key] = value;\n }\n } else {\n target[key] = value;\n }\n return true;\n }\n};\nfunction callServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(JSON.stringify({\n event: 'sdc_call',\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args\n }));\n });\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise(resolve => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\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 && data.type === 'sdc_recall') {\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === 'sdc_event') {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === 'sdc_redirect') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('onNavLink', data.link);\n }\n }\n };\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error('SDC Socket closed unexpectedly');\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n SDC_SOCKET.onerror = function (err) {\n console.error('Socket encountered error: ', err.message, 'Closing socket');\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\nfunction close() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\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}\nfunction isConnected() {\n return new Promise(resolve => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\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 = {}, cb_resolve = null, cb_reject = null) {\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: 'list_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n filter: filter\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 detailView(pk = -1, cb_resolve = null, cb_reject = null) {\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: pk\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 class=\"container-fluid\">');\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 class=\"container-fluid\">');\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 ? '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);\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) {\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 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 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) {\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 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 delete this.open_request[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 delete this.open_request['_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 delete this.open_request['_connecting_process'];\n } else if (data.type === 'load') {\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 delete this.open_request[data.event_id];\n }\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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QUVBLElBQUksSUFBSSxDQUFDekcsV0FBVyxDQUFDSixNQUFNLEtBQUssQ0FBQyxFQUFFO01BQy9CLElBQUksQ0FBQ0ssTUFBTSxHQUFHLElBQUksQ0FBQ0QsV0FBVyxDQUFDMkQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsTUFBTTtNQUNILElBQUksQ0FBQzFELE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEI7SUFFQSxPQUFPNkcsT0FBTztFQUVsQjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19zb2NrZXQuanM/YWRiYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcH0gZnJvbSAnLi9zZGNfbWFpbi5qcyc7XG5pbXBvcnQge3RyaWdnZXJ9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcblxubGV0IElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xubGV0IElTX0NPTk5FQ1RJTkcgPSBmYWxzZTtcbmxldCBTRENfU09DS0VUID0gbnVsbFxuY29uc3QgTUFYX0ZJTEVfVVBMT0FEID0gMjUwMDA7XG5sZXQgT1BFTl9SRVFVRVNUUyA9IHt9O1xuXG5cbmNsYXNzIFN1Yk1vZGVsIHtcblxuICAgIGNvbnN0cnVjdG9yKHBrLCBtb2RlbCkge1xuICAgICAgICB0aGlzLnBrID0gcGs7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU0RDIE1vZGVsIE5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxcbiAgICAgKi9cbiAgICBzZXQgbW9kZWwobW9kZWwpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICB9XG5cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBzdWIgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAgICogQHJldHVybnMge01vZGVsfVxuICAgICAqL1xuICAgIGxvYWQoY29udHJvbGxlcikge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTW9kZWwgaXMgbm90IHNldCEhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm5ld01vZGVsKHRoaXMuX21vZGVsLCB7cGs6IHRoaXMucGt9KTtcbiAgICB9XG59XG5cbmNvbnN0IE1vZGVsUHJveHlIYW5kbGVyID0ge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtrZXldID8/IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3ViTW9kZWwpIHtcbiAgICAgICAgICAgIGlmICghdmFsdWUucGsgJiYgdmFsdWUucGsgIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gbmV3IE51bWJlcih2YWx1ZS5wayk7XG4gICAgICAgICAgICBuZXdWYWwubG9hZCA9IHZhbHVlLmxvYWQuYmluZCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHNldCh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgICAgICAgaWYgKG9sZFZhbCBpbnN0YW5jZW9mIFN1Yk1vZGVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdwaycpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlLnBrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZFZhbC5wayA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsbFNlcnZlcihhcHAsIGNvbnRyb2xsZXIsIGZ1bmNOYW1lLCBhcmdzKSB7XG5cbiAgICBsZXQgaWQgPSB1dWlkdjQoKTtcbiAgICBpc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBTRENfU09DS0VULnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6ICdzZGNfY2FsbCcsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxuICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICBmdW5jdGlvbjogZnVuY05hbWUsXG4gICAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIE9QRU5fUkVRVUVTVFNbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9jb25uZWN0KCkge1xuICAgIElTX0NPTk5FQ1RJTkcgPSB0cnVlO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgICAgICBTRENfU09DS0VUID0gbmV3IFdlYlNvY2tldChgd3NzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL3dzL2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU0RDX1NPQ0tFVCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL3dzL2ApO1xuICAgICAgICB9XG5cblxuICAgICAgICBTRENfU09DS0VULm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoJ3B1c2hFcnJvck1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF1bMV0oZGF0YS5kYXRhIHx8IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoTXNnJywgZGF0YS5oZWFkZXIgfHwgJycsIGRhdGEubXNnIHx8ICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gJ3NkY19yZWNhbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzBdKGRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gJ3NkY19ldmVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50ID0gZGF0YS5ldmVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKGV2ZW50LCBkYXRhLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfcmVkaXJlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoJ29uTmF2TGluaycsIGRhdGEubGluayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFNEQ19TT0NLRVQub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTREMgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVsxXSh7fSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNba2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIFNEQ19TT0NLRVQub25lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJywgZXJyLm1lc3NhZ2UsICdDbG9zaW5nIHNvY2tldCcpO1xuICAgICAgICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICB9XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2hpZGRlbl9pbnB1dHModmFsdWUpIHtcblxuICAgIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICAgIGxldCBpc0ludFJlZyA9IC9eLT9cXGQrJC87XG4gICAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gICAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuXG4gICAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goaXNCb29sUmVnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0ludFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvbm5lY3RlZCgpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGVsX25hbWUge3N0cmluZ31cbiAgICAgKiBAcGFyYW0gbW9kZWxfcXVlcnkge2pzb259XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobW9kZWxfbmFtZSwgbW9kZWxfcXVlcnkgPSB7fSkge1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHRoaXMubW9kZWxfbmFtZSA9IG1vZGVsX25hbWU7XG4gICAgICAgIHRoaXMubW9kZWxfcXVlcnkgPSBtb2RlbF9xdWVyeTtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdCA9IHt9O1xuICAgICAgICB0aGlzLm9uX3VwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbl9jcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtX2lkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCBpZHggPSAtMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICArK2lkeDtcbiAgICAgICAgICAgICAgICBpZiAoaWR4IDwgdGhpcy52YWx1ZXNfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdGhpcy52YWx1ZXNfbGlzdFtpZHhdLCBkb25lOiBmYWxzZX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIGJ5UGsocGspIHtcbiAgICAgICAgaWYgKHBrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwayA9IHBhcnNlSW50KHBrKTtcbiAgICAgICAgICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgICAgICAgICAgICBwayA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVsZW0gPSB0aGlzLnZhbHVlc19saXN0LmZpbmQoZWxtID0+IGVsbS5wayA9PT0gcGspO1xuICAgICAgICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgICAgICAgICAgZWxlbSA9IG5ldyBQcm94eSh7cGs6IHBrfSwgTW9kZWxQcm94eUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzX2xpc3QucHVzaChlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7cGs6IHBrfTtcblxuICAgIH1cblxuICAgIGZpbHRlcihtb2RlbF9xdWVyeSkge1xuICAgICAgICB0aGlzLm1vZGVsX3F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5tb2RlbF9xdWVyeSwgbW9kZWxfcXVlcnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RWaWV3KGZpbHRlciA9IHt9LCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgICAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2xpc3RfdmlldycsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2xpc3QpO1xuICAgICAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XTtcblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9saXN0O1xuICAgIH1cblxuICAgIGRldGFpbFZpZXcocGsgPSAtMSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgICAgICAgIHBrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0ICRkaXZfbGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgICAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgICAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMuaXNDb25uZWN0ZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBrID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdFswXS5wa1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdkZXRhaWxfdmlldycsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHBrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAkZGl2X2xpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9saXN0KTtcbiAgICAgICAgICAgICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgICAgICAgICAgfV07XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICRkaXZfbGlzdDtcbiAgICB9XG5cbiAgICBzeW5jRm9ybVRvTW9kZWwoJGZvcm1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNGb3JtKCRmb3Jtcyk7XG4gICAgfVxuXG4gICAgc3luY01vZGVsVG9Gb3JtKCRmb3Jtcykge1xuICAgICAgICBpZiAoISRmb3JtcyB8fCAhJGZvcm1zLmhhc0NsYXNzKHRoaXMuZm9ybV9pZCkpIHtcbiAgICAgICAgICAgICRmb3JtcyA9ICQoYC4ke3RoaXMuZm9ybV9pZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS1tb2RlbF9waycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBrID0gJCh0aGlzKS5kYXRhKCdtb2RlbF9waycpO1xuICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gc2VsZi5ieVBrKHBrKTtcbiAgICAgICAgICAgIGZvciAobGV0IGZvcm1faXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBmb3JtX2l0ZW0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1faXRlbS5jaGVja2VkID0gaW5zdGFuY2VbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJyAmJiBpbnN0YW5jZVtuYW1lXSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaXRlbXMuYWRkKGluc3RhbmNlW25hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1faXRlbS5maWxlcyA9IGNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZm9ybV9pdGVtKS52YWwoaW5zdGFuY2VbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgICAgICBpZiAoISRmb3JtcyB8fCAhJGZvcm1zLmhhc0NsYXNzKHRoaXMuZm9ybV9pZCkpIHtcbiAgICAgICAgICAgICRmb3JtcyA9ICQoYC4ke3RoaXMuZm9ybV9pZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgaW5zdGFuY2VzID0gW107XG5cbiAgICAgICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0ICRmb3JtID0gJCh0aGlzKTtcbiAgICAgICAgICAgIGxldCBwayA9ICRmb3JtLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGZvcm1faXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gcGFyc2VfaGlkZGVuX2lucHV0cygkKGZvcm1faXRlbSkudmFsKCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IGZvcm1faXRlbS5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1faXRlbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gZm9ybV9pdGVtLmZpbGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSAkKGZvcm1faXRlbSkudmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoIDw9IDEgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gaW5zdGFuY2VzLmF0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZXM7XG5cbiAgICB9XG5cbiAgICBjcmVhdGVGb3JtKGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2dldEZvcm0obnVsbCwgJ2NyZWF0ZV9mb3JtJywgbnVsbCwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9mb3JtO1xuICAgIH1cblxuICAgIGVkaXRGb3JtKHBrID0gLTEsIGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgICAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICAgICAgICBwayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgICAgICBsb2FkX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGsgPD0gLTEpIHtcbiAgICAgICAgICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9nZXRGb3JtKHBrLCAnZWRpdF9mb3JtJywgbnVsbCwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9mb3JtO1xuICAgIH1cblxuICAgIG5hbWVkRm9ybShwayA9IC0xLCBmb3JtTmFtZSwgY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgICAgICAgIHBrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvYWRfcHJvbWlzZTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmlzQ29ubmVjdGVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2FkX3Byb21pc2UgPSB0aGlzLmxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCAkZGl2X2Zvcm0gPSAkKCc8ZGl2ICBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgICAgIGxvYWRfcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChwayA8PSAtMSkge1xuICAgICAgICAgICAgICAgIHBrID0gdGhpcy52YWx1ZXNfbGlzdC5hdChwaykucGs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2dldEZvcm0ocGssICduYW1lZF9mb3JtJywgZm9ybU5hbWUsICRkaXZfZm9ybSwgY2JfcmVzb2x2ZSwgY2JfcmVqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICRkaXZfZm9ybTtcbiAgICB9XG5cblxuICAgIF9nZXRGb3JtKHBrLCBldmVudF90eXBlLCBmb3JtTmFtZSwgJGRpdl9mb3JtLCBjYl9yZXNvbHZlLCBjYl9yZWplY3QpIHtcbiAgICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgICAgICAgIHBrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50X3R5cGUsXG4gICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgIHBrOiBwayxcbiAgICAgICAgICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCA/ICdjcmVhdGUnIDogJ2VkaXQnO1xuXG4gICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgbGV0ICRmb3JtID0gJGRpdl9mb3JtLmNsb3Nlc3QoJ2Zvcm0nKS5hZGRDbGFzcyhgc2RjLW1vZGVsLSR7Y2xhc3NOYW1lfS1mb3JtIHNkYy1tb2RlbC1mb3JtICR7dGhpcy5mb3JtX2lkfWApLmRhdGEoJ21vZGVsJywgdGhpcykuZGF0YSgnbW9kZWxfcGsnLCBwayk7XG4gICAgICAgICAgICBpZiAoJGZvcm0ubGVuZ3RoID4gMCAmJiAhJGZvcm1bMF0uaGFzQXR0cmlidXRlKCdzZGNfc3VibWl0JykpIHtcbiAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKCdzZGNfc3VibWl0JywgJ3N1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9mb3JtKTtcbiAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkZm9ybSA9ICQoJzxmb3JtPicpLmFwcGVuZCh0aGlzLmNyZWF0ZUZvcm0oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0Zvcm1Ub01vZGVsKCRmb3JtKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzYXZlKHBrID0gLTEpIHtcbiAgICAgICAgcGsgPSBwYXJzZUludChwayk7XG4gICAgICAgIGlmIChpc05hTihwaykpIHtcbiAgICAgICAgICAgIHBrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGVtX2xpc3Q7XG4gICAgICAgICAgICBpZiAocGsgPiAtMSkge1xuICAgICAgICAgICAgICAgIGVsZW1fbGlzdCA9IFt0aGlzLmJ5UGsocGspXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbV9saXN0ID0gdGhpcy52YWx1ZXNfbGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwX2xpc3QgPSBbXVxuICAgICAgICAgICAgZWxlbV9saXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICAgIHBfbGlzdC5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnc2F2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3RdO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBfbGlzdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZSh2YWx1ZXMgPSB0aGlzLnZhbHVlcykge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkRmlsZXModmFsdWVzKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogZmlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHR5cGVvZiByZXMuZGF0YS5pbnN0YW5jZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKSA6IHJlcy5kYXRhLmluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlbGV0ZShwayA9IC0xKSB7XG4gICAgICAgIHBrID0gcGFyc2VJbnQocGspO1xuICAgICAgICBpZiAoaXNOYU4ocGspKSB7XG4gICAgICAgICAgICBwayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwayA9PT0gLTEpIHBrID0gdGhpcy52YWx1ZXM/LnBrO1xuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdkZWxldGUnLFxuICAgICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGs6IHBrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc19jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc19jb25uZXRpbmdfcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddID0gWygpID0+IHtcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLl9jaGVja0Nvbm5lY3Rpb24oKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtyZXNvbHZlX29yaWdpbiwgcmVqZWN0X29yaWdpbl0gPSB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddO1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ10gPSBbXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfb3JpZ2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdF9vcmlnaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXNbJ3NvY2tldCddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYW4oKSB7XG4gICAgICAgIHRoaXMudmFsdWVzX2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX3JlYWRGaWxlcyhlbGVtKSB7XG4gICAgICAgIGxldCB0b19zb2x2ZSA9IFtdO1xuICAgICAgICBsZXQgZmlsZXMgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbGVtKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgIHRvX3NvbHZlLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAoKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW1iZXJfb2ZfY2h1bmtzID0gcGFyc2VJbnQoTWF0aC5jZWlsKHJlc3VsdC5sZW5ndGggLyBNQVhfRklMRV9VUExPQUQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyX29mX2NodW5rczsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAndXBsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuazogcmVzdWx0LnNsaWNlKE1BWF9GSUxFX1VQTE9BRCAqIGksIE1BWF9GSUxFX1VQTE9BRCAqIChpICsgMSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfY2h1bmtzOiBudW1iZXJfb2ZfY2h1bmtzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSkoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodG9fc29sdmUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbk1lc3NhZ2UoZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKGRhdGEuaXNfZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5fcmVxdWVzdC5oYXNPd25Qcm9wZXJ0eShkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzFdKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICAgICAgICAgIHRyaWdnZXIoJ3B1c2hFcnJvck1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ11bMV0oZGF0YSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ107XG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0b19yZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoTXNnJywgZGF0YS5oZWFkZXIgfHwgJycsIGRhdGEubXNnIHx8ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc19jb25uZXRpbmdfcHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ11bMF0oZGF0YSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ2xvYWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgICAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uX3Jlcyk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnb25fdXBkYXRlJyB8fCBkYXRhLnR5cGUgPT09ICdvbl9jcmVhdGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uX3Jlcyk7XG4gICAgICAgICAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IgPSB0aGlzLm9uX2NyZWF0ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYiA9IHRoaXMub25fdXBkYXRlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNiKG9iaik7XG4gICAgICAgICAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBvYmo7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gZGF0YS5kYXRhPy5pbnN0YW5jZVxuICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5kYXRhLmluc3RhbmNlID0gSlNPTi5wYXJzZShkYXRhLmRhdGEuaW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuX3JlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXVswXShkYXRhKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY29ubmVjdFRvU2VydmVyKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbW9kZWxfaWRlbnRpZmllciA9IGAke3RoaXMubW9kZWxfbmFtZX1gICsgKHRoaXMubW9kZWxfaWQgPiAwID8gYC8ke3RoaXMubW9kZWxfaWR9YCA6ICcnKTtcbiAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsX2lkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTREMgTW9kZWwgKCR7dGhpcy5tb2RlbF9uYW1lfSwgJHt0aGlzLm1vZGVsX2lkfSkgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHlgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc19jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcGVuX3JlcXVlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlWzFdKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvX3JlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBNb2RlbCBTb2NrZXQgZW5jb3VudGVyZWQgZXJyb3I6ICR7ZXJyfSBDbG9zaW5nIHNvY2tldGApO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc19jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIF9jaGVja0Nvbm5lY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnY29ubmVjdCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9wYXJzZVNlcnZlclJlcyhyZXMpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQganNvbl9kYXRhIG9mIHJlcykge1xuICAgICAgICAgICAgY29uc3QgcGsgPSBqc29uX2RhdGEucGs7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB0aGlzLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoanNvbl9kYXRhLmZpZWxkcykpIHtcbiAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdlsnX19pc19zZGNfbW9kZWxfXyddKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IG5ldyBTdWJNb2RlbCh2WydwayddLCB2Wydtb2RlbCddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGVkLnB1c2gob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB0aGlzLnZhbHVlc19saXN0LmF0KC0xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcblxuICAgIH1cbn0iXSwibmFtZXMiOlsiYXBwIiwidHJpZ2dlciIsInV1aWR2NCIsIklTX0NPTk5FQ1RFRCIsIklTX0NPTk5FQ1RJTkciLCJTRENfU09DS0VUIiwiTUFYX0ZJTEVfVVBMT0FEIiwiT1BFTl9SRVFVRVNUUyIsIlN1Yk1vZGVsIiwiY29uc3RydWN0b3IiLCJwayIsIm1vZGVsIiwiX21vZGVsIiwibG9hZCIsImNvbnRyb2xsZXIiLCJUeXBlRXJyb3IiLCJuZXdNb2RlbCIsIk1vZGVsUHJveHlIYW5kbGVyIiwiZ2V0IiwidGFyZ2V0Iiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJuZXdWYWwiLCJOdW1iZXIiLCJiaW5kIiwic2V0Iiwib2xkVmFsIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsU2VydmVyIiwiZnVuY05hbWUiLCJhcmdzIiwiaWQiLCJpc0Nvbm5lY3RlZCIsInRoZW4iLCJzZW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZW50IiwiZnVuY3Rpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9jb25uZWN0Iiwid2luZG93IiwibG9jYXRpb24iLCJwcm90b2NvbCIsIldlYlNvY2tldCIsImhvc3QiLCJvbm1lc3NhZ2UiLCJlIiwiZGF0YSIsInBhcnNlIiwiaXNfZXJyb3IiLCJtc2ciLCJoZWFkZXIiLCJ0eXBlIiwicGF5bG9hZCIsImxpbmsiLCJvbmNsb3NlIiwiY29uc29sZSIsImVycm9yIiwiT2JqZWN0IiwiZW50cmllcyIsInNldFRpbWVvdXQiLCJvbmVycm9yIiwiZXJyIiwibWVzc2FnZSIsImNsb3NlIiwib25vcGVuIiwicGFyc2VfaGlkZGVuX2lucHV0cyIsImlzRmxvYXRSZWciLCJpc0ludFJlZyIsImlzQm9vbFJlZyIsImlzU3RyaW5nUmVnIiwidG9Mb3dlckNhc2UiLCJtYXRjaCIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsInN1YnN0cmluZyIsImxlbmd0aCIsIk1vZGVsIiwibW9kZWxfbmFtZSIsIm1vZGVsX3F1ZXJ5IiwidmFsdWVzX2xpc3QiLCJ2YWx1ZXMiLCJfaXNfY29ubmVjdGVkIiwiX2lzX2Nvbm5ldGluZ19wcm9jZXNzIiwiX2F1dG9fcmVjb25uZWN0Iiwic29ja2V0Iiwib3Blbl9yZXF1ZXN0Iiwib25fdXBkYXRlIiwib25fY3JlYXRlIiwiZm9ybV9pZCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiaWR4IiwibmV4dCIsImRvbmUiLCJieVBrIiwiaXNOYU4iLCJlbGVtIiwiZmluZCIsImVsbSIsIlByb3h5IiwicHVzaCIsImZpbHRlciIsImFzc2lnbiIsImV2ZW50X3R5cGUiLCJldmVudF9pZCIsImxpc3RWaWV3IiwiY2JfcmVzb2x2ZSIsImNiX3JlamVjdCIsIiRkaXZfbGlzdCIsIiQiLCJhcHBlbmQiLCJodG1sIiwicmVmcmVzaCIsInJlcyIsImRldGFpbFZpZXciLCJsb2FkX3Byb21pc2UiLCJzeW5jRm9ybVRvTW9kZWwiLCIkZm9ybXMiLCJzeW5jRm9ybSIsInN5bmNNb2RlbFRvRm9ybSIsImhhc0NsYXNzIiwic2VsZiIsImVhY2giLCJoYXNBdHRyaWJ1dGUiLCJpbnN0YW5jZSIsImZvcm1faXRlbSIsImVsZW1lbnRzIiwibmFtZSIsImNoZWNrZWQiLCJGaWxlIiwiY29udGFpbmVyIiwiRGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJhZGQiLCJmaWxlcyIsInZhbCIsImluc3RhbmNlcyIsIiRmb3JtIiwiYXQiLCJjcmVhdGVGb3JtIiwiJGRpdl9mb3JtIiwiX2dldEZvcm0iLCJlZGl0Rm9ybSIsIm5hbWVkRm9ybSIsImZvcm1OYW1lIiwiZm9ybV9uYW1lIiwiY2xhc3NOYW1lIiwiY2xvc2VzdCIsImFkZENsYXNzIiwiYXR0ciIsIm5ldyIsInNhdmUiLCJlbGVtX2xpc3QiLCJwX2xpc3QiLCJmb3JFYWNoIiwiX3JlYWRGaWxlcyIsIl9wYXJzZVNlcnZlclJlcyIsImFsbCIsImNyZWF0ZSIsImRlbGV0ZSIsIl9jb25uZWN0VG9TZXJ2ZXIiLCJfY2hlY2tDb25uZWN0aW9uIiwicmVzb2x2ZV9vcmlnaW4iLCJyZWplY3Rfb3JpZ2luIiwiY2xlYW4iLCJ0b19zb2x2ZSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJyZXN1bHQiLCJudW1iZXJfb2ZfY2h1bmtzIiwiTWF0aCIsImNlaWwiLCJmaWxlX25hbWUiLCJmaWVsZF9uYW1lIiwiY29udGVudF9sZW5ndGgiLCJzaXplIiwiaSIsImNodW5rIiwic2xpY2UiLCJjb250ZW50X3R5cGUiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJfb25NZXNzYWdlIiwianNvbl9yZXMiLCJvYmoiLCJjYiIsIm1vZGVsX2lkZW50aWZpZXIiLCJtb2RlbF9pZCIsIl9rZXkiLCJ1cGRhdGVkIiwianNvbl9kYXRhIiwiayIsInYiLCJmaWVsZHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n");
|
88
88
|
|
89
89
|
/***/ }),
|
90
90
|
|
package/dist/ugly.index.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
var 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]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{wz:()=>ne,ms:()=>q,yA:()=>he,sD:()=>d,kb:()=>_,wH:()=>O,on:()=>N,YV:()=>C,eA:()=>p,YF:()=>E,WQ:()=>ue,QN:()=>de,gV:()=>F});const r=/([^\s,]+)/g,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function s(){return n||(n=$("body")),n}function i(){return new Promise((function(e){e()}))}function l(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function a(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const c=(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 h(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",u,!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 u(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 d(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 f(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function _(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 m(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o={};for(let t in r)r.hasOwnProperty(t)&&t!==R&&!e.includes(t)&&(o[t]=r[t]);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=d(e[r],t);n.push(o)}return n}(r,n)}function g(e,t,n){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(o,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=m(s,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)g(e._mixins[r],t,n)}let y={},v={};function w(){return Object.keys(v)}function k(e,t){if(e){let n=a(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function b(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(v[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 v[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(v[e][0]);let s=new(function(e,...t){let n=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}get mixins(){return this._mixins}};return c(n,e),t.forEach((e=>{c(n,e)})),n}(v[n][0],...o));return s._tagName=n,k(e,s),s.$container=t,function(e,t){g(t,e,t)}(t,s),s}function O(e,t,n,r){let o=a(n);if(y[o]){let n=y[o];return k(e,n),n.$container=t,n}return b(e,t,n,r)}function C(e){const t=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=U(e,e.contentUrl),e.contentUrl=t.url),Promise.all([M(e.contentUrl,t.args,e._tagName,e.contentReload)]).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)||i()).then((()=>t)))))}(e).then((function(t){return function(e,t){return I(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){return e.refresh&&e.refresh()}(e))).catch((function(t){return I(e,t)}));return e.load_async?Promise.resolve():t}let P={},S={};function N(e,t){return E(e),S.hasOwnProperty(e)?t[S[e]]?void P[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function E(e,t){t||(t=e),S[e]||(S[e]=t,P[e]=[])}function q(e){for(let t in P)if(P.hasOwnProperty(t))for(let n=P[t].length;n>=0;n--)e===P[t][n]&&P[t].splice(n,1)}function F(e){let t=Array.apply(null,arguments);if(e=t.shift(),!P.hasOwnProperty(e)||!S.hasOwnProperty(e))return i();let n=P[e],r=S[e],o=[];for(let e=0;e<n.length;e++){let s=n[e][r].apply(n[e],t);void 0!==s&&o.push(s)}return Promise.all(o)}let x={};const R="_controller_",j="_sdc_controller_";function T(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(T(s,t,n))})),o}function M(e,t,n,r){return e?x[n]?Promise.resolve(x[n]):(t.VERSION=he.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(x[n]=e),e})).catch((function(e){throw 301===e.status&&F("_RedirectOnView",e.responseJSON["url-link"]),F("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function L(e,t){return t=t||e.data(R),J(he.tagNames,e,t)}function U(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 D(e){return e.hasClass(j)?e.data(`${R}`):e.closest(`.${j}`).data(`${R}`)}function A(e,t,n,r){let o=e.data(R);return o?L(e,o):(o=O(r,e,t,n),e.data(R,o),e.addClass(j),C(o))}function I(e,t){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 L(e.$container,e)}function J(e,t,n){return new Promise((r=>{let o=T(t,e,n),s=o.length;if(0===s)return r();for(let e=0;e<o.length;e++)A(o[e].dom,o[e].tag,o[e].super,n).then((()=>{if(s--,0===s)return r()}))}))}function V(e){return G(e,e.$container)}function G(e,t){const n=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let r;if(t.hasClass("_with_handler"))r=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(r=e[t])}void 0!==r&&("function"==typeof r&&(r=r.bind(e)(t.data())),n.push(Promise.resolve(r).then((n=>{const r=$("<div></div>");return r.append(n),J(w(),r,e).then((()=>G(e,r).then((()=>(t.safeEmpty().text("").append(n),!0)))))}))))})),Promise.all(n)}let W=!1,B=!1,K=null;const z=25e3;let H={};class Q{constructor(e,t){this._pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}set pk(e){this._pk=e}get pk(){return this._pk}load(e){if(!this._model)throw new TypeError("Model is not set!!");return e.newModel(this._model,{pk:this._pk})}}const Y={get(e,t){const n=e[t]??void 0;if(n instanceof Q){if(!n.pk&&0!==n.pk)return null;const e=new Number(n.pk);return e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];r instanceof Q?r.pk=n:e[t]=n}else e[t]=n;return!0}};function X(){return B=!0,new Promise((e=>{K="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),K.onmessage=function(e){let t=JSON.parse(e.data);if(t.is_error)(t.msg||t.header)&&F("pushErrorMsg",t.header||"",t.msg||""),H[t.id]&&(H[t.id][1](t.data||null),delete H[t.id]);else if((t.msg||t.header)&&F("pushMsg",t.header||"",t.msg||""),t.type&&"sdc_recall"===t.type)H[t.id]&&(H[t.id][0](t.data),delete H[t.id]);else if(t.type&&"sdc_event"===t.type){let e=t.event;e&&F(e,t.payload)}else t.type&&"sdc_redirect"===t.type&&F("onNavLink",t.link)},K.onclose=function(){W&&console.error("SDC Socket closed unexpectedly"),W=!1;for(const[e,t]of Object.entries(H))t[1]({}),delete H[e];setTimeout((()=>{X()}),1e3)},K.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),W)try{K.close()}catch(e){}},K.onopen=function(){W=!0,B=!1,e()}}))}function Z(){if(W){W=!1;try{K.close()}catch(e){}}}function ee(){return new Promise((e=>W?e():B?void setTimeout((()=>{ee().then((()=>{e()}))}),200):e(X())))}class te{constructor(e,t={}){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=f()}[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){let t=this.values_list.find((t=>t.pk===e));return t||(t=new Proxy({pk:e},Y),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=f();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){let r=$('<div class="container-fluid">');return this.isConnected().then((()=>{const o=f();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,filter:e}})),this.open_request[o]=[e=>{r.append(e.html),he.refresh(r),t&&t(e)},e=>{n&&n(e)}]})),r}detailView(e=-1,t=null,n=null){let r,o=$('<div class="container-fluid">');return r=0!==this.values_list.length?this.isConnected():this.load(),r.then((()=>{-1===e&&(e=this.values_list[0].pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[e=>{o.append(e.html),he.refresh(o),t&&t(e)},e=>{n&&n(e)}]})),o}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]=(o=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===o.toLowerCase():"undefined"!==o?"none"===o.toLowerCase()?null:o.match(/^-?\d+$/)?parseInt(o):o.match(/^-?\d+\.?\d+$/)?parseFloat(o):o.match(/^(['][^']*['])|(["][^"]*["])$/)?o.substring(1,o.length-1):o:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var o;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 class="container-fluid">');return this.isConnected().then((()=>{this._getForm(null,"create_form",null,n,e,t)})),n}editForm(e=-1,t=null,n=null){let r;r=0!==this.values_list.length?this.isConnected():this.load();let o=$('<div class="container-fluid">');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;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){const i=f();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?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let n=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);n.length>0&&!n[0].hasAttribute("sdc_submit")&&n.attr("sdc_submit","submitModelFormDistributor"),he.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){return this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=f();n.push(new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",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=JSON.parse(e.data.instance);this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=f();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=JSON.parse(e.data.instance);this._parseServerRes(t),n(e)},r]}))}))))}delete(e=-1){-1===e&&(e=this.values?.pk);const t=f();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){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=f();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/z));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(z*e,z*(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),delete this.open_request[t.event_id]),(t.msg||t.header)&&F("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),delete this.open_request._connecting_process,this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&F("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),delete this.open_request._connecting_process;else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[];const n=this._parseServerRes(e);t.args.data=n}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}this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),delete this.open_request[t.event_id])}}_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=f();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 Q(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}}class ne{constructor(){this._uuid=f(),this.contentUrl="",this.contentReload=!1,this.hasSubnavView=!1,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="",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){he.DEBUG&&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(){he.DEBUG&&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}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()){q(this);const e=a(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=Object.assign({},...e)}post(e,t){return he.post(this,e,t)}get(e,t){return he.get(this,e,t)}submitForm(e,t,n){return he.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){let o=f();return ee().then((()=>{K.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{H[o]=[e,t]}))}(n[1],this._tagName,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);const n=new te(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new te(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 he.refresh(this.$container,this)}reload(){return he.reloadController(this)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const o=r.syncForm(e);for(let t of o)n.push(new Promise(((n,o)=>{let s;s=null!==t.pk?r.save(t.pk):r.create(t),s.then((t=>{_(e),n(t)})).catch((t=>{p(e,$(t.html)),o(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const re=["onbeforeunload"],oe=Object.keys(window).filter((e=>/^on/.test(e)&&!re.includes(e))).map((e=>e.slice(2)));function se(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){if(!r&&(r=D(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 ie(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(" ")))}))}}const le={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):(le[e.toLowerCase()]&&(e=le[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 ae,ce,he={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:y,rootController:null,_isInit:!1,_origin_trigger:null,init_sdc:()=>{he._isInit||(he._isInit=!0,he._origin_trigger?Z():(he._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return oe.includes(t)||(oe.push(t),$(window).on(t,se)),he._origin_trigger.call(this,e)},he.updateJquery()),ee(),function(){const e=$(window);oe.forEach((t=>{e.off(t).on(t,se)}))}(),he.rootController=he.rootController||new ne),he.tagNames=w();for(let[e,t]of Object.entries(he.Global))t.$container||(y[e].$container=s());return J(he.tagNames,s(),he.rootController)},updateJquery:()=>{$.fn.safeReplace=function(e){return he.safeReplace($(this),e)},$.fn.safeEmpty=function(){return he.safeEmpty($(this))},$.fn.safeRemove=function(){return he.safeRemove($(this))}},controllerToTag:e=>l(e.name).replace(/-controller$/,""),registerGlobal:e=>{let t=he.controllerToTag(e),n=new e;v[t]=[n,[]],n._tagName=t,window[a(t)]=y[a(t)]=n},cleanCache:()=>{x={}},register:e=>{let t=he.controllerToTag(e);return v[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=l(n):n&&(e=he.controllerToTag(n)),v[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=he.CSRF_TOKEN,he.ajax(e,t,params,$.post)),get:(e,t,n)=>he.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=he.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?F("onNavLink",t["url-link"]):o.then((()=>{he.refresh(e.$container)}))})).catch(i)));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?F("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{h(o,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then((()=>{he.refresh(e.$container)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((o,s)=>{h(r,t||e.action,n||e.method).then(o).catch(s)}))},getController:e=>D(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);he.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),he.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${R}`)&&e.data(`${R}`).remove()})),e.find(`.${j}`).each((function(){const e=$(this).data(`${R}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=U(e,e.contentUrl);return e.contentUrl=t.url,M(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);e._childController={},J(he.tagNames,n,e).then((()=>{he.safeEmpty(e.$container),e.$container.append(n),he.refresh(e.$container,e)}))})),refresh:(e,t)=>{if(t||(t=he.getController(e)),!t)return i();let n=t,r=[];for(;n;)n.isEventsSet=!1,r.unshift(n),n=n._parentController;return J(he.tagNames,t.$container,t).then((()=>{V(t).then((()=>{for(let e of r)ie(e);t.onRefresh(e)}))}))}};const ue=Z,de={get_controller:async function(e,t={},n=""){if(!jest)throw new Error("JEST is not defined");ae||(ce=$.ajax.bind($),ae=jest.spyOn($,"ajax"),ae.mockImplementation((function(e){return ce(e).then((e=>e)).catch((e=>e))})));const r=$("body");he.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),he._isInit=!1,he.cleanCache(),await he.init_sdc(),he.getController(o)}};var fe=t.wz,_e=t.ms,pe=t.yA,me=t.sD,ge=t.kb,ye=t.wH,ve=t.on,we=t.YV,$e=t.eA,ke=t.YF,be=t.WQ,Oe=t.QN,Ce=t.gV;export{fe as AbstractSDC,_e as allOff,pe as app,me as checkIfParamNumberBoolOrString,ge as clearErrorsInForm,ye as controllerFactory,ve as on,we as runControlFlowFunctions,$e as setErrorsInForm,ke as setEvent,be as socketReconnect,Oe as test_utils,Ce as trigger};
|
1
|
+
var 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]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{wz:()=>ne,ms:()=>q,yA:()=>he,sD:()=>d,kb:()=>_,wH:()=>O,on:()=>S,YV:()=>C,eA:()=>p,YF:()=>E,WQ:()=>ue,QN:()=>de,gV:()=>F});const r=/([^\s,]+)/g,s=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function o(){return n||(n=$("body")),n}function i(){return new Promise((function(e){e()}))}function l(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function a(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const c=(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 h(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",u,!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 u(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 d(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 f(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function _(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"),s=e.find(".form-group."+n);s.addClass("has-error"),s.find(".form-input-container").append(t.find(".alert-danger"))})),r}function m(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),s={};for(let t in r)r.hasOwnProperty(t)&&t!==R&&!e.includes(t)&&(s[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let s=e[t];r.hasOwnProperty(s)?n.push(r[s]):n.push("undefined")}return n.push(s),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let s=d(e[r],t);n.push(s)}return n}(r,n)}function g(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let o;var i;"function"==typeof e._on_init_params?o=e._on_init_params():o=(i=e.onInit.toString().replace(s,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=m(o,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)g(e._mixins[r],t,n)}let y={},v={};function w(){return Object.keys(v)}function b(e,t){if(e){let n=a(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function k(e,t,n,r){let s=[];r=function(e,t){e=(e=e.concat(v[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 v[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)s.push(v[e][0]);let o=new(function(e,...t){let n=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}get mixins(){return this._mixins}};return c(n,e),t.forEach((e=>{c(n,e)})),n}(v[n][0],...s));return o._tagName=n,b(e,o),o.$container=t,function(e,t){g(t,e,t)}(t,o),o}function O(e,t,n,r){let s=a(n);if(y[s]){let n=y[s];return b(e,n),n.$container=t,n}return k(e,t,n,r)}function C(e){const t=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=L(e,e.contentUrl),e.contentUrl=t.url),Promise.all([M(e.contentUrl,t.args,e._tagName,e.contentReload)]).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)||i()).then((()=>t)))))}(e).then((function(t){return function(e,t){return A(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){return e.refresh&&e.refresh()}(e))).catch((function(t){return A(e,t)}));return e.load_async?Promise.resolve():t}let N={},P={};function S(e,t){return E(e),P.hasOwnProperty(e)?t[P[e]]?void N[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function E(e,t){t||(t=e),P[e]||(P[e]=t,N[e]=[])}function q(e){for(let t in N)if(N.hasOwnProperty(t))for(let n=N[t].length;n>=0;n--)e===N[t][n]&&N[t].splice(n,1)}function F(e){let t=Array.apply(null,arguments);if(e=t.shift(),!N.hasOwnProperty(e)||!P.hasOwnProperty(e))return i();let n=N[e],r=P[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 x={};const R="_controller_",j="_sdc_controller_";function T(e,t,n){if(!e)return[];let r=e.children(),s=[];return r.each((function(e,r){let o=$(r),i=o.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?s.push({tag:i[0],super:i.splice(1)||[],dom:o}):i[0].startsWith("this.")?o.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):s=s.concat(T(o,t,n))})),s}function M(e,t,n,r){return e?x[n]?Promise.resolve(x[n]):(t.VERSION=he.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(x[n]=e),e})).catch((function(e){throw 301===e.status&&F("_RedirectOnView",e.responseJSON["url-link"]),F("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function I(e,t){return t=t||e.data(R),J(he.tagNames,e,t)}function L(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 s=e._urlParams[r],o=RegExp("%\\("+s+"\\)\\w","gm");t=t.replace(o,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function U(e){return e.hasClass(j)?e.data(`${R}`):e.closest(`.${j}`).data(`${R}`)}function D(e,t,n,r){let s=e.data(R);return s?I(e,s):(s=O(r,e,t,n),e.data(R,s),e.addClass(j),C(s))}function A(e,t){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 I(e.$container,e)}function J(e,t,n){return new Promise((r=>{let s=T(t,e,n),o=s.length;if(0===o)return r();for(let e=0;e<s.length;e++)D(s[e].dom,s[e].tag,s[e].super,n).then((()=>{if(o--,0===o)return r()}))}))}function V(e){return G(e,e.$container)}function G(e,t){const n=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let r;if(t.hasClass("_with_handler"))r=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(r=e[t])}void 0!==r&&("function"==typeof r&&(r=r.bind(e)(t.data())),n.push(Promise.resolve(r).then((n=>{const r=$("<div></div>");return r.append(n),J(w(),r,e).then((()=>G(e,r).then((()=>(t.safeEmpty().text("").append(n),!0)))))}))))})),Promise.all(n)}let W=!1,B=!1,K=null;const z=25e3;let H={};class Q{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 e.newModel(this._model,{pk:this.pk})}}const Y={get(e,t){const n=e[t]??void 0;if(n instanceof Q){if(!n.pk&&0!==n.pk)return null;const e=new Number(n.pk);return e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];r instanceof Q?n.hasOwnProperty("pk")?r.pk=n.pk:r.pk=n:e[t]=n}else e[t]=n;return!0}};function X(){return B=!0,new Promise((e=>{K="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),K.onmessage=function(e){let t=JSON.parse(e.data);if(t.is_error)(t.msg||t.header)&&F("pushErrorMsg",t.header||"",t.msg||""),H[t.id]&&(H[t.id][1](t.data||null),delete H[t.id]);else if((t.msg||t.header)&&F("pushMsg",t.header||"",t.msg||""),t.type&&"sdc_recall"===t.type)H[t.id]&&(H[t.id][0](t.data),delete H[t.id]);else if(t.type&&"sdc_event"===t.type){let e=t.event;e&&F(e,t.payload)}else t.type&&"sdc_redirect"===t.type&&F("onNavLink",t.link)},K.onclose=function(){W&&console.error("SDC Socket closed unexpectedly"),W=!1;for(const[e,t]of Object.entries(H))t[1]({}),delete H[e];setTimeout((()=>{X()}),1e3)},K.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),W)try{K.close()}catch(e){}},K.onopen=function(){W=!0,B=!1,e()}}))}function Z(){if(W){W=!1;try{K.close()}catch(e){}}}function ee(){return new Promise((e=>W?e():B?void setTimeout((()=>{ee().then((()=>{e()}))}),200):e(X())))}class te{constructor(e,t={}){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=f()}[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},Y),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=f();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){let r=$('<div class="container-fluid">');return this.isConnected().then((()=>{const s=f();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:s,args:{model_name:this.model_name,model_query:this.model_query,filter:e}})),this.open_request[s]=[e=>{r.append(e.html),he.refresh(r),t&&t(e)},e=>{n&&n(e)}]})),r}detailView(e=-1,t=null,n=null){e=parseInt(e),isNaN(e)&&(e=-1);let r,s=$('<div class="container-fluid">');return r=0!==this.values_list.length?this.isConnected():this.load(),r.then((()=>{-1===e&&(e=this.values_list[0].pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[e=>{s.append(e.html),he.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]=(s=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===s.toLowerCase():"undefined"!==s?"none"===s.toLowerCase()?null:s.match(/^-?\d+$/)?parseInt(s):s.match(/^-?\d+\.?\d+$/)?parseFloat(s):s.match(/^(['][^']*['])|(["][^"]*["])$/)?s.substring(1,s.length-1):s:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var s;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 class="container-fluid">');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 s=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,s,t,n)})),s}namedForm(e=-1,t,n=null,r=null){let s;e=parseInt(e),isNaN(e)&&(e=-1),s=0!==this.values_list.length?this.isConnected():this.load();let o=$('<div class="container-fluid">');return s.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,o,n,r)})),o}_getForm(e,t,n,r,s,o){e=parseInt(e),isNaN(e)&&(e=-1);const i=f();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?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let n=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);n.length>0&&!n[0].hasAttribute("sdc_submit")&&n.attr("sdc_submit","submitModelFormDistributor"),he.refresh(r),s&&s(t)},e=>{o&&o(e)}]}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=f();n.push(new Promise(((n,r)=>{this._readFiles(e).then((s=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((s=>{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:s}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;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=f();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){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,s]of Object.entries(e))s instanceof File&&t.push(new Promise(((e,t)=>{((r,s)=>{let o=new FileReader;o.onload=o=>{const i=f();this.open_request[i]=[e,t];let l=o.target.result,a=parseInt(Math.ceil(l.length/z));n[r]={id:i,file_name:s.name,field_name:r,content_length:s.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(z*e,z*(e+1)),idx:e,number_of_chunks:a,file_name:s.name,field_name:r,content_length:s.size,content_type:s.type,model_name:this.model_name,model_query:this.model_query}}))},o.onerror=()=>{t()},o.readAsBinaryString(s)})(r,s)})));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),delete this.open_request[t.event_id]),(t.msg||t.header)&&F("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),delete this.open_request._connecting_process,this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&F("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),delete this.open_request._connecting_process;else if("load"===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),delete this.open_request[t.event_id])}}_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=f();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 Q(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}}class ne{constructor(){this._uuid=f(),this.contentUrl="",this.contentReload=!1,this.hasSubnavView=!1,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="",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){he.DEBUG&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let s=this._mixins[r];"function"==typeof s[e]&&n.push(s[e].apply(this,t))}return Promise.all(n).then((()=>{this._isMixin=!1}))}}onInit(){he.DEBUG&&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}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()){q(this);const e=a(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=Object.assign({},...e)}post(e,t){return he.post(this,e,t)}get(e,t){return he.get(this,e,t)}submitForm(e,t,n){return he.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){let s=f();return ee().then((()=>{K.send(JSON.stringify({event:"sdc_call",id:s,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{H[s]=[e,t]}))}(n[1],this._tagName,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);const n=new te(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new te(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 he.refresh(this.$container,this)}reload(){return he.reloadController(this)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const s=r.syncForm(e);for(let t of s)n.push(new Promise(((n,s)=>{let o;o=null!==t.pk?r.save(t.pk):r.create(t),o.then((t=>{_(e),n(t)})).catch((t=>{p(e,$(t.html)),s(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const re=["onbeforeunload"],se=Object.keys(window).filter((e=>/^on/.test(e)&&!re.includes(e))).map((e=>e.slice(2)));function oe(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,s=!1,o=!1;for(e.stopImmediatePropagation=()=>o=!0,e.stopPropagation=()=>o=s=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i){if(!r&&(r=U(n),!r))return;for(;r;){if(i.split(" ").forEach((o=>{if(s)return;let i=null;if("function"==typeof o)i=o;else if("function"==typeof r[o])i=r[o];else if("string"==typeof o&&o.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[o.slice(11)],!i)return}i&&i.call(r,n,e)})),o)return;r=r._parentController}}if(s)return;n=n.parent()}return{res:!0}}function ie(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 s=`this.event_${t}`;-1===r.indexOf(s)&&(r.push(s),e.attr(`sdc_${n}`,r.join(" ")))}))}}const le={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):(le[e.toLowerCase()]&&(e=le[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 ae,ce,he={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:y,rootController:null,_isInit:!1,_origin_trigger:null,init_sdc:()=>{he._isInit||(he._isInit=!0,he._origin_trigger?Z():(he._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return se.includes(t)||(se.push(t),$(window).on(t,oe)),he._origin_trigger.call(this,e)},he.updateJquery()),ee(),function(){const e=$(window);se.forEach((t=>{e.off(t).on(t,oe)}))}(),he.rootController=he.rootController||new ne),he.tagNames=w();for(let[e,t]of Object.entries(he.Global))t.$container||(y[e].$container=o());return J(he.tagNames,o(),he.rootController)},updateJquery:()=>{$.fn.safeReplace=function(e){return he.safeReplace($(this),e)},$.fn.safeEmpty=function(){return he.safeEmpty($(this))},$.fn.safeRemove=function(){return he.safeRemove($(this))}},controllerToTag:e=>l(e.name).replace(/-controller$/,""),registerGlobal:e=>{let t=he.controllerToTag(e),n=new e;v[t]=[n,[]],n._tagName=t,window[a(t)]=y[a(t)]=n},cleanCache:()=>{x={}},register:e=>{let t=he.controllerToTag(e);return v[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=l(n):n&&(e=he.controllerToTag(n)),v[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=he.CSRF_TOKEN,he.ajax(e,t,params,$.post)),get:(e,t,n)=>he.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=he.VERSION,n._method=n._method||"api";const s=new Promise(((o,i)=>r(t,n).then(((t,n,r)=>{o(t,n,r),"redirect"===t.status?F("onNavLink",t["url-link"]):s.then((()=>{he.refresh(e.$container)}))})).catch(i)));return s},submitFormAndUpdateView:(e,t,n,r)=>{let s=new FormData(t);const o=e=>{e["url-link"]?F("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{h(s,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?o(t):i.then((()=>{he.refresh(e.$container)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,o(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((s,o)=>{h(r,t||e.action,n||e.method).then(s).catch(o)}))},getController:e=>U(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);he.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),he.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${R}`)&&e.data(`${R}`).remove()})),e.find(`.${j}`).each((function(){const e=$(this).data(`${R}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=L(e,e.contentUrl);return e.contentUrl=t.url,M(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);e._childController={},J(he.tagNames,n,e).then((()=>{he.safeEmpty(e.$container),e.$container.append(n),he.refresh(e.$container,e)}))})),refresh:(e,t)=>{if(t||(t=he.getController(e)),!t)return i();let n=t,r=[];for(;n;)n.isEventsSet=!1,r.unshift(n),n=n._parentController;return J(he.tagNames,t.$container,t).then((()=>{V(t).then((()=>{for(let e of r)ie(e);t.onRefresh(e)}))}))}};const ue=Z,de={get_controller:async function(e,t={},n=""){if(!jest)throw new Error("JEST is not defined");ae||(ce=$.ajax.bind($),ae=jest.spyOn($,"ajax"),ae.mockImplementation((function(e){return ce(e).then((e=>e)).catch((e=>e))})));const r=$("body");he.updateJquery(),r.safeEmpty();const s=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))s.data(e,n);const o=$("<div></div>").append(s);return r.append(o),he._isInit=!1,he.cleanCache(),await he.init_sdc(),he.getController(s)}};var fe=t.wz,_e=t.ms,pe=t.yA,me=t.sD,ge=t.kb,ye=t.wH,ve=t.on,we=t.YV,$e=t.eA,be=t.YF,ke=t.WQ,Oe=t.QN,Ce=t.gV;export{fe as AbstractSDC,_e as allOff,pe as app,me as checkIfParamNumberBoolOrString,ge as clearErrorsInForm,ye as controllerFactory,ve as on,we as runControlFlowFunctions,$e as setErrorsInForm,be as setEvent,ke as socketReconnect,Oe as test_utils,Ce as trigger};
|
package/package.json
CHANGED
@@ -12,7 +12,7 @@ let OPEN_REQUESTS = {};
|
|
12
12
|
class SubModel {
|
13
13
|
|
14
14
|
constructor(pk, model) {
|
15
|
-
this.
|
15
|
+
this.pk = pk;
|
16
16
|
this._model = model;
|
17
17
|
}
|
18
18
|
|
@@ -28,18 +28,6 @@ class SubModel {
|
|
28
28
|
return this._model;
|
29
29
|
}
|
30
30
|
|
31
|
-
/**
|
32
|
-
* SDC Model PK
|
33
|
-
* @param {Number} pk
|
34
|
-
*/
|
35
|
-
set pk(pk) {
|
36
|
-
this._pk = pk;
|
37
|
-
}
|
38
|
-
|
39
|
-
get pk() {
|
40
|
-
return this._pk;
|
41
|
-
}
|
42
|
-
|
43
31
|
/**
|
44
32
|
* Load the sub model.
|
45
33
|
*
|
@@ -50,7 +38,7 @@ class SubModel {
|
|
50
38
|
if (!this._model) {
|
51
39
|
throw new TypeError("Model is not set!!");
|
52
40
|
}
|
53
|
-
return controller.newModel(this._model, {pk: this.
|
41
|
+
return controller.newModel(this._model, {pk: this.pk});
|
54
42
|
}
|
55
43
|
}
|
56
44
|
|
@@ -58,7 +46,7 @@ const ModelProxyHandler = {
|
|
58
46
|
get(target, key) {
|
59
47
|
const value = target[key] ?? undefined;
|
60
48
|
if (value instanceof SubModel) {
|
61
|
-
if(!value.pk && value.pk !== 0) {
|
49
|
+
if (!value.pk && value.pk !== 0) {
|
62
50
|
return null
|
63
51
|
}
|
64
52
|
const newVal = new Number(value.pk);
|
@@ -71,7 +59,11 @@ const ModelProxyHandler = {
|
|
71
59
|
if (key in target) {
|
72
60
|
const oldVal = target[key];
|
73
61
|
if (oldVal instanceof SubModel) {
|
74
|
-
|
62
|
+
if (value.hasOwnProperty('pk')) {
|
63
|
+
oldVal.pk = value.pk;
|
64
|
+
} else {
|
65
|
+
oldVal.pk = value;
|
66
|
+
}
|
75
67
|
} else {
|
76
68
|
target[key] = value;
|
77
69
|
}
|
@@ -273,6 +265,10 @@ export class Model {
|
|
273
265
|
|
274
266
|
byPk(pk) {
|
275
267
|
if (pk !== null) {
|
268
|
+
pk = parseInt(pk);
|
269
|
+
if (isNaN(pk)) {
|
270
|
+
pk = -1;
|
271
|
+
}
|
276
272
|
let elem = this.values_list.find(elm => elm.pk === pk);
|
277
273
|
if (!elem) {
|
278
274
|
elem = new Proxy({pk: pk}, ModelProxyHandler);
|
@@ -337,6 +333,10 @@ export class Model {
|
|
337
333
|
}
|
338
334
|
|
339
335
|
detailView(pk = -1, cb_resolve = null, cb_reject = null) {
|
336
|
+
pk = parseInt(pk);
|
337
|
+
if (isNaN(pk)) {
|
338
|
+
pk = -1;
|
339
|
+
}
|
340
340
|
let $div_list = $('<div class="container-fluid">');
|
341
341
|
|
342
342
|
let load_promise;
|
@@ -458,6 +458,10 @@ export class Model {
|
|
458
458
|
}
|
459
459
|
|
460
460
|
editForm(pk = -1, cb_resolve = null, cb_reject = null) {
|
461
|
+
pk = parseInt(pk);
|
462
|
+
if (isNaN(pk)) {
|
463
|
+
pk = -1;
|
464
|
+
}
|
461
465
|
let load_promise;
|
462
466
|
if (this.values_list.length !== 0) {
|
463
467
|
load_promise = this.isConnected();
|
@@ -479,6 +483,10 @@ export class Model {
|
|
479
483
|
}
|
480
484
|
|
481
485
|
namedForm(pk = -1, formName, cb_resolve = null, cb_reject = null) {
|
486
|
+
pk = parseInt(pk);
|
487
|
+
if (isNaN(pk)) {
|
488
|
+
pk = -1;
|
489
|
+
}
|
482
490
|
let load_promise;
|
483
491
|
if (this.values_list.length !== 0) {
|
484
492
|
load_promise = this.isConnected();
|
@@ -501,6 +509,10 @@ export class Model {
|
|
501
509
|
|
502
510
|
|
503
511
|
_getForm(pk, event_type, formName, $div_form, cb_resolve, cb_reject) {
|
512
|
+
pk = parseInt(pk);
|
513
|
+
if (isNaN(pk)) {
|
514
|
+
pk = -1;
|
515
|
+
}
|
504
516
|
const id = uuidv4();
|
505
517
|
this.socket.send(JSON.stringify({
|
506
518
|
event: 'model',
|
@@ -540,6 +552,10 @@ export class Model {
|
|
540
552
|
}
|
541
553
|
|
542
554
|
save(pk = -1) {
|
555
|
+
pk = parseInt(pk);
|
556
|
+
if (isNaN(pk)) {
|
557
|
+
pk = -1;
|
558
|
+
}
|
543
559
|
return this.isConnected().then(() => {
|
544
560
|
let elem_list;
|
545
561
|
if (pk > -1) {
|
@@ -565,8 +581,8 @@ export class Model {
|
|
565
581
|
}));
|
566
582
|
|
567
583
|
this.open_request[id] = [(res) => {
|
568
|
-
let data = JSON.parse(res.data.instance);
|
569
|
-
this._parseServerRes(data);
|
584
|
+
let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;
|
585
|
+
res.data.instance = this._parseServerRes(data);
|
570
586
|
resolve(res);
|
571
587
|
}, reject];
|
572
588
|
});
|
@@ -595,8 +611,8 @@ export class Model {
|
|
595
611
|
}));
|
596
612
|
|
597
613
|
this.open_request[id] = [(res) => {
|
598
|
-
let data = JSON.parse(res.data.instance);
|
599
|
-
this._parseServerRes(data);
|
614
|
+
let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;
|
615
|
+
res.data.instance = this._parseServerRes(data)[0];
|
600
616
|
resolve(res);
|
601
617
|
}, reject];
|
602
618
|
})
|
@@ -605,7 +621,11 @@ export class Model {
|
|
605
621
|
}
|
606
622
|
|
607
623
|
delete(pk = -1) {
|
608
|
-
|
624
|
+
pk = parseInt(pk);
|
625
|
+
if (isNaN(pk)) {
|
626
|
+
pk = -1;
|
627
|
+
}
|
628
|
+
if (pk === -1) pk = this.values?.pk;
|
609
629
|
const id = uuidv4();
|
610
630
|
return this.isConnected().then(() => {
|
611
631
|
return new Promise((resolve, reject) => {
|
@@ -753,8 +773,7 @@ export class Model {
|
|
753
773
|
} else if (data.type === 'load') {
|
754
774
|
const json_res = JSON.parse(data.args.data);
|
755
775
|
this.values_list = [];
|
756
|
-
|
757
|
-
data.args.data = obj;
|
776
|
+
data.args.data = this._parseServerRes(json_res);
|
758
777
|
|
759
778
|
} else if (data.type === 'on_update' || data.type === 'on_create') {
|
760
779
|
const json_res = JSON.parse(data.args.data);
|
@@ -772,6 +791,12 @@ export class Model {
|
|
772
791
|
data.args.data = obj;
|
773
792
|
|
774
793
|
}
|
794
|
+
|
795
|
+
let instance = data.data?.instance
|
796
|
+
if (instance) {
|
797
|
+
data.data.instance = JSON.parse(data.data.instance);
|
798
|
+
}
|
799
|
+
|
775
800
|
if (this.open_request.hasOwnProperty(data.event_id)) {
|
776
801
|
this.open_request[data.event_id][0](data);
|
777
802
|
delete this.open_request[data.event_id];
|
@@ -847,7 +872,7 @@ export class Model {
|
|
847
872
|
_parseServerRes(res) {
|
848
873
|
let updated = [];
|
849
874
|
for (let json_data of res) {
|
850
|
-
const pk = json_data.pk
|
875
|
+
const pk = json_data.pk;
|
851
876
|
const obj = this.byPk(pk);
|
852
877
|
for (const [k, v] of Object.entries(json_data.fields)) {
|
853
878
|
if (v && typeof v === 'object' && v['__is_sdc_model__']) {
|