"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.VXETablePluginExportXLSX = void 0; var _xeUtils = _interopRequireDefault(require("xe-utils/methods/xe-utils")); var _xlsx = _interopRequireDefault(require("xlsx")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function toBuffer(wbout) { var buf = new ArrayBuffer(wbout.length); var view = new Uint8Array(buf); for (var index = 0; index !== wbout.length; ++index) { view[index] = wbout.charCodeAt(index) & 0xFF; } return buf; } function exportXLSX(params) { var $table = params.$table, options = params.options, columns = params.columns, datas = params.datas; var sheetName = options.sheetName, type = options.type, isHeader = options.isHeader, isFooter = options.isFooter, original = options.original, message = options.message, footerFilterMethod = options.footerFilterMethod; var colHead = {}; var footList = []; if (isHeader) { columns.forEach(function (column) { colHead[column.id] = _xeUtils["default"].toString(original ? column.property : column.getTitle()); }); } var rowList = datas.map(function (row, rowIndex) { var item = {}; columns.forEach(function (column, columnIndex) { var cellValue; var property = column.property; var isIndex = column.type === 'index'; if (!original || isIndex) { cellValue = isIndex ? column.indexMethod ? column.indexMethod({ row: row, rowIndex: rowIndex, column: column, columnIndex: columnIndex }) : rowIndex + 1 : row[column.id]; } else { cellValue = _xeUtils["default"].get(row, property); } item[column.id] = cellValue; }); return item; }); if (isFooter) { var footerData = $table.footerData; var footers = footerFilterMethod ? footerData.filter(footerFilterMethod) : footerData; footers.forEach(function (rows) { var item = {}; columns.forEach(function (column) { item[column.id] = rows[$table.getColumnIndex(column)] || ''; }); footList.push(item); }); } var book = _xlsx["default"].utils.book_new(); var sheet = _xlsx["default"].utils.json_to_sheet((isHeader ? [colHead] : []).concat(rowList).concat(footList), { skipHeader: true }); // 转换数据 _xlsx["default"].utils.book_append_sheet(book, sheet, sheetName); var wbout = _xlsx["default"].write(book, { bookType: type, bookSST: false, type: 'binary' }); var blob = new Blob([toBuffer(wbout)], { type: 'application/octet-stream' }); // 保存导出 downloadFile(blob, options); if (message !== false) { $table.$XModal.message({ message: i18n('vxe.table.expSuccess'), status: 'success' }); } } function downloadFile(blob, options) { if (window.Blob) { var filename = options.filename, type = options.type; if (navigator.msSaveBlob) { navigator.msSaveBlob(blob, "".concat(filename, ".").concat(type)); } else { var linkElem = document.createElement('a'); linkElem.target = '_blank'; linkElem.download = "".concat(filename, ".").concat(type); linkElem.href = URL.createObjectURL(blob); document.body.appendChild(linkElem); linkElem.click(); document.body.removeChild(linkElem); } } else { console.error(i18n('vxe.error.notExp')); } } function replaceDoubleQuotation(val) { return val.replace(/^"/, '').replace(/"$/, ''); } function parseCsv(columns, content) { var list = content.split('\n'); var fields = []; var rows = []; if (list.length) { var rList = list.slice(1); list[0].split(',').forEach(function (val) { var field = replaceDoubleQuotation(val); if (field) { fields.push(field); } }); rList.forEach(function (r) { if (r) { var item = {}; r.split(',').forEach(function (val, colIndex) { item[fields[colIndex]] = replaceDoubleQuotation(val); }); rows.push(item); } }); } return { fields: fields, rows: rows }; } function checkImportData(columns, fields, rows) { var tableFields = []; columns.forEach(function (column) { var field = column.property; if (field) { tableFields.push(field); } }); return tableFields.every(function (field) { return fields.includes(field); }); } function importXLSX(params) { var $table = params.$table, columns = params.columns, options = params.options, file = params.file; var _importCallback = $table._importCallback, _importResolve = $table._importResolve; var fileReader = new FileReader(); fileReader.onload = function (e) { var workbook = _xlsx["default"].read(e.target.result, { type: 'binary' }); var csvData = _xlsx["default"].utils.sheet_to_csv(workbook.Sheets.Sheet1); var rest = parseCsv(columns, csvData); var fields = rest.fields, rows = rest.rows; var status = checkImportData(columns, fields, rows); if (status) { $table.createData(rows).then(function (data) { if (options.mode === 'append') { $table.insertAt(data, -1); } else { $table.reloadData(data); } }); if (options.message !== false) { $table.$XModal.message({ message: i18n('vxe.table.impSuccess'), status: 'success' }); } } else if (options.message !== false) { $table.$XModal.message({ message: i18n('vxe.error.impFields'), status: 'error' }); } if (_importResolve) { _importResolve(status); $table._importResolve = null; } else if (_importCallback) { // 已废弃 _importCallback(status); $table._importCallback = null; } }; fileReader.readAsBinaryString(file); } function handleImportEvent(params) { if (params.options.type === 'xlsx') { importXLSX(params); return false; } } function handleExportEvent(params) { if (params.options.type === 'xlsx') { exportXLSX(params); return false; } } /** * 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式 */ var VXETablePluginExportXLSX = { install: function install(xtable) { Object.assign(xtable.types, { xlsx: 1 }); xtable.interceptor.mixin({ 'event.import': handleImportEvent, 'event.export': handleExportEvent }); VXETablePluginExportXLSX.t = xtable.t; } }; exports.VXETablePluginExportXLSX = VXETablePluginExportXLSX; function i18n(key) { if (VXETablePluginExportXLSX.t) { return VXETablePluginExportXLSX.t(key); } } if (typeof window !== 'undefined' && window.VXETable) { window.VXETable.use(VXETablePluginExportXLSX); } var _default = VXETablePluginExportXLSX; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbInRvQnVmZmVyIiwid2JvdXQiLCJidWYiLCJBcnJheUJ1ZmZlciIsImxlbmd0aCIsInZpZXciLCJVaW50OEFycmF5IiwiaW5kZXgiLCJjaGFyQ29kZUF0IiwiZXhwb3J0WExTWCIsInBhcmFtcyIsIiR0YWJsZSIsIm9wdGlvbnMiLCJjb2x1bW5zIiwiZGF0YXMiLCJzaGVldE5hbWUiLCJ0eXBlIiwiaXNIZWFkZXIiLCJpc0Zvb3RlciIsIm9yaWdpbmFsIiwibWVzc2FnZSIsImZvb3RlckZpbHRlck1ldGhvZCIsImNvbEhlYWQiLCJmb290TGlzdCIsImZvckVhY2giLCJjb2x1bW4iLCJpZCIsIlhFVXRpbHMiLCJ0b1N0cmluZyIsInByb3BlcnR5IiwiZ2V0VGl0bGUiLCJyb3dMaXN0IiwibWFwIiwicm93Iiwicm93SW5kZXgiLCJpdGVtIiwiY29sdW1uSW5kZXgiLCJjZWxsVmFsdWUiLCJpc0luZGV4IiwiaW5kZXhNZXRob2QiLCJnZXQiLCJmb290ZXJEYXRhIiwiZm9vdGVycyIsImZpbHRlciIsInJvd3MiLCJnZXRDb2x1bW5JbmRleCIsInB1c2giLCJib29rIiwiWExTWCIsInV0aWxzIiwiYm9va19uZXciLCJzaGVldCIsImpzb25fdG9fc2hlZXQiLCJjb25jYXQiLCJza2lwSGVhZGVyIiwiYm9va19hcHBlbmRfc2hlZXQiLCJ3cml0ZSIsImJvb2tUeXBlIiwiYm9va1NTVCIsImJsb2IiLCJCbG9iIiwiZG93bmxvYWRGaWxlIiwiJFhNb2RhbCIsImkxOG4iLCJzdGF0dXMiLCJ3aW5kb3ciLCJmaWxlbmFtZSIsIm5hdmlnYXRvciIsIm1zU2F2ZUJsb2IiLCJsaW5rRWxlbSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInRhcmdldCIsImRvd25sb2FkIiwiaHJlZiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJjb25zb2xlIiwiZXJyb3IiLCJyZXBsYWNlRG91YmxlUXVvdGF0aW9uIiwidmFsIiwicmVwbGFjZSIsInBhcnNlQ3N2IiwiY29udGVudCIsImxpc3QiLCJzcGxpdCIsImZpZWxkcyIsInJMaXN0Iiwic2xpY2UiLCJmaWVsZCIsInIiLCJjb2xJbmRleCIsImNoZWNrSW1wb3J0RGF0YSIsInRhYmxlRmllbGRzIiwiZXZlcnkiLCJpbmNsdWRlcyIsImltcG9ydFhMU1giLCJmaWxlIiwiX2ltcG9ydENhbGxiYWNrIiwiX2ltcG9ydFJlc29sdmUiLCJmaWxlUmVhZGVyIiwiRmlsZVJlYWRlciIsIm9ubG9hZCIsImUiLCJ3b3JrYm9vayIsInJlYWQiLCJyZXN1bHQiLCJjc3ZEYXRhIiwic2hlZXRfdG9fY3N2IiwiU2hlZXRzIiwiU2hlZXQxIiwicmVzdCIsImNyZWF0ZURhdGEiLCJ0aGVuIiwiZGF0YSIsIm1vZGUiLCJpbnNlcnRBdCIsInJlbG9hZERhdGEiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJoYW5kbGVJbXBvcnRFdmVudCIsImhhbmRsZUV4cG9ydEV2ZW50IiwiVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYIiwiaW5zdGFsbCIsInh0YWJsZSIsIk9iamVjdCIsImFzc2lnbiIsInR5cGVzIiwieGxzeCIsImludGVyY2VwdG9yIiwibWl4aW4iLCJ0Iiwia2V5IiwiVlhFVGFibGUiLCJ1c2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7OztBQUVBLFNBQVNBLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQTRCO0FBQzFCLE1BQUlDLEdBQUcsR0FBRyxJQUFJQyxXQUFKLENBQWdCRixLQUFLLENBQUNHLE1BQXRCLENBQVY7QUFDQSxNQUFJQyxJQUFJLEdBQUcsSUFBSUMsVUFBSixDQUFlSixHQUFmLENBQVg7O0FBQ0EsT0FBSyxJQUFJSyxLQUFLLEdBQUcsQ0FBakIsRUFBb0JBLEtBQUssS0FBS04sS0FBSyxDQUFDRyxNQUFwQyxFQUE0QyxFQUFFRyxLQUE5QztBQUFxREYsSUFBQUEsSUFBSSxDQUFDRSxLQUFELENBQUosR0FBY04s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LENBQUNHLEtBQXJCLEVBQTRCO0FBQUVDLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBQTVCO0FBQ0FKLElBQUFBLE1BQU0sQ0FBQ0ssV0FBUCxDQUFtQkMsS0FBbkIsQ0FBeUI7QUFDdkIsc0JBQWdCVixpQkFETztBQUV2QixzQkFBZ0JDO0FBRk8sS0FBekI7QUFJQUMsSUFBQUEsd0JBQXdCLENBQUNTLENBQXpCLEdBQTZCUCxNQUFNLENBQUNPLENBQXBDO0FBQ0Q7QUFSMEMsQ0FBdEM7OztBQVdQLFNBQVN2RSxJQUFULENBQWN3RSxHQUFkLEVBQXlCO0FBQ3ZCLE1BQUlWLHdCQUF3QixDQUFDUyxDQUE3QixFQUFnQztBQUM5QixXQUFPVCx3QkFBd0IsQ0FBQ1MsQ0FBekIsQ0FBMkJDLEdBQTNCLENBQVA7QUFDRDtBQUNGOztBQUVELElBQUksT0FBT3RFLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUNBLE1BQU0sQ0FBQ3VFLFFBQTVDLEVBQXNEO0FBQ3BEdkUsRUFBQUEsTUFBTSxDQUFDdUUsUUFBUCxDQUFnQkMsR0FBaEIsQ0FBb0JaLHdCQUFwQjtBQUNEOztlQUVjQSx3QiIsImZpbGUiOiJpbmRleC5jb21tb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgWEVVdGlscyBmcm9tICd4ZS11dGlscy9tZXRob2RzL3hlLXV0aWxzJ1xyXG5pbXBvcnQgVlhFVGFibGUgZnJvbSAndnhlLXRhYmxlL2xpYi92eGUtdGFibGUnXHJcbmltcG9ydCBYTFNYIGZyb20gJ3hsc3gnXHJcblxyXG5mdW5jdGlvbiB0b0J1ZmZlcih3Ym91dDogYW55KSB7XHJcbiAgbGV0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcih3Ym91dC5sZW5ndGgpXHJcbiAgbGV0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpXHJcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCAhPT0gd2JvdXQubGVuZ3RoOyArK2luZGV4KSB2aWV3W2luZGV4XSA9IHdib3V0LmNoYXJDb2RlQXQoaW5kZXgpICYgMHhGRlxyXG4gIHJldHVybiBidWZcclxufVxyXG5cclxuZnVuY3Rpb24gZXhwb3J0WExTWChwYXJhbXM6IGFueSkge1xyXG4gIGNvbnN0IHsgJHRhYmxlLCBvcHRpb25zLCBjb2x1bW5zLCBkYXRhcyB9ID0gcGFyYW1zXHJcbiAgY29uc3QgeyBzaGVldE5hbWUsIHR5cGUsIGlzSGVhZGVyLCBpc0Zvb3Rlciwgb3JpZ2luYWwsIG1lc3NhZ2UsIGZvb3RlckZpbHRlck1ldGhvZCB9ID0gb3B0aW9uc1xyXG4gIGNvbnN0IGNvbEhlYWQ6IGFueSA9IHt9XHJcbiAgY29uc3QgZm9vdExpc3Q6IGFueVtdID0gW11cclxuICBpZiAoaXNIZWFkZXIpIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgY29sSGVhZFtjb2x1bW4uaWRdID0gWEVVdGlscy50b1N0cmluZyhvcmlnaW5hbCA/IGNvbHVtbi5wcm9wZXJ0eSA6IGNvbHVtbi5nZXRUaXRsZSgpKVxyXG4gICAgfSlcclxuICB9XHJcbiAgY29uc3Qgcm93TGlzdDogYW55W10gPSBkYXRhcy5tYXAoKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBpdGVtOiBhbnkgPSB7fVxyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSwgY29sdW1uSW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBsZXQgY2VsbFZhbHVlXHJcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29sdW1uLnByb3BlcnR5XHJcbiAgICAgIGNvbnN0IGlzSW5kZXggPSBjb2x1bW4udHlwZSA9PT0gJ2luZGV4J1xyXG4gICAgICBpZiAoIW9yaWdpbmFsIHx8IGlzSW5kZXgpIHtcclxuICAgICAgICBjZWxsVmFsdWUgPSBpc0luZGV4ID8gKGNvbHVtbi5pbmRleE1ldGhvZCA/IGNvbHVtbi5pbmRleE1ldGhvZCh7IHJvdywgcm93SW5kZXgsIGNvbHVtbiwgY29sdW1uSW5kZXggfSkgOiByb3dJbmRleCArIDEpIDogcm93W2NvbHVtbi5pZF1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjZWxsVmFsdWUgPSBYRVV0aWxzLmdldChyb3csIHByb3BlcnR5KVxyXG4gICAgICB9XHJcbiAgICAgIGl0ZW1bY29sdW1uLmlkXSA9IGNlbGxWYWx1ZVxyXG4gICAgfSlcclxuICAgIHJldHVybiBpdGVtXHJcbiAgfSlcclxuICBpZiAoaXNGb290ZXIpIHtcclxuICAgIGNvbnN0IGZvb3RlckRhdGE6IGFueVtdID0gJHRhYmxlLmZvb3RlckRhdGFcclxuICAgIGNvbnN0IGZvb3RlcnM6IGFueVtdID0gZm9vdGVyRmlsdGVyTWV0aG9kID8gZm9vdGVyRGF0YS5maWx0ZXIoZm9vdGVyRmlsdGVyTWV0aG9kKSA6IGZvb3RlckRhdGFcclxuICAgIGZvb3RlcnMuZm9yRWFjaCgocm93czogYW55W10pID0+IHtcclxuICAgICAgY29uc3QgaXRlbTogYW55ID0ge31cclxuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGl0ZW1bY29sdW1uLmlkXSA9IHJvd3NbJHRhYmxlLmdldENvbHVtbkluZGV4KGNvbHVtbildIHx8ICcnXHJcbiAgICAgIH0pXHJcbiAgICAgIGZvb3RMaXN0LnB1c2goaXRlbSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIGNvbnN0IGJvb2sgPSBYTFNYLnV0aWxzLmJvb2tfbmV3KClcclxuICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldCgoaXNIZWFkZXIgPyBbY29sSGVhZF0gOiBbXSkuY29uY2F0KHJvd0xpc3QpLmNvbmNhdChmb290TGlzdCksIHsgc2tpcEhlYWRlcjogdHJ1ZSB9KVxyXG4gIC8vIOi9rOaNouaVsOaNrlxyXG4gIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQoYm9vaywgc2hlZXQsIHNoZWV0TmFtZSlcclxuICBjb25zdCB3Ym91dCA9IFhMU1gud3JpdGUoYm9vaywgeyBib29rVHlwZTogdHlwZSwgYm9va1NTVDogZmFsc2UsIHR5cGU6ICdiaW5hcnknIH0pXHJcbiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0b0J1ZmZlcih3Ym91dCldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pXHJcbiAgLy8g5L+d5a2Y5a+85Ye6XHJcbiAgZG93bmxvYWRGaWxlKGJsb2IsIG9wdGlvbnMpXHJcbiAgaWYgKG1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICAkdGFibGUuJFhNb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogaTE4bigndnhlLnRhYmxlLmV4cFN1Y2Nlc3MnKSwgc3RhdHVzOiAnc3VjY2VzcycgfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvd25sb2FkRmlsZShibG9iOiBCbG9iLCBvcHRpb25zOiBhbnkpIHtcclxuICBpZiAod2luZG93LkJsb2IpIHtcclxuICAgIGNvbnN0IHsgZmlsZW5hbWUsIHR5cGUgfSA9IG9wdGlvbnNcclxuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xyXG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBgJHtmaWxlbmFtZX0uJHt0eXBlfWApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgbGlua0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgbGlua0VsZW0udGFyZ2V0ID0gJ19ibGFuaydcclxuICAgICAgbGlua0VsZW0uZG93bmxvYWQgPSBgJHtmaWxlbmFtZX0uJHt0eXBlfWBcclxuICAgICAgbGlua0VsZW0uaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rRWxlbSlcclxuICAgICAgbGlua0VsZW0uY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmtFbGVtKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zb2xlLmVycm9yKGkxOG4oJ3Z4ZS5lcnJvci5ub3RFeHAnKSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VEb3VibGVRdW90YXRpb24odmFsOiBzdHJpbmcpIHtcclxuICByZXR1cm4gdmFsLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cIiQvLCAnJylcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VDc3YoY29sdW1uczogYW55W10sIGNvbnRlbnQ6IHN0cmluZykge1xyXG4gIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gY29udGVudC5zcGxpdCgnXFxuJylcclxuICBjb25zdCBmaWVsZHM6IGFueVtdID0gW11cclxuICBjb25zdCByb3dzOiBhbnlbXSA9IFtdXHJcbiAgaWYgKGxpc3QubGVuZ3RoKSB7XHJcbiAgICBjb25zdCByTGlzdDogc3RyaW5nW10gPSBsaXN0LnNsaWNlKDEpXHJcbiAgICBsaXN0WzBdLnNwbGl0KCcsJykuZm9yRWFjaCgodmFsOiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgZmllbGQ6IHN0cmluZyA9IHJlcGxhY2VEb3VibGVRdW90YXRpb24odmFsKVxyXG4gICAgICBpZiAoZmllbGQpIHtcclxuICAgICAgICBmaWVsZHMucHVzaChmaWVsZClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHJMaXN0LmZvckVhY2goKHI6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAocikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW06IGFueSA9IHt9XHJcbiAgICAgICAgci5zcGxpdCgnLCcpLmZvckVhY2goKHZhbDogc3RyaW5nLCBjb2xJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpdGVtW2ZpZWxkc1tjb2xJbmRleF1dID0gcmVwbGFjZURvdWJsZVF1b3RhdGlvbih2YWwpXHJcbiAgICAgICAgfSlcclxuICAgICAgICByb3dzLnB1c2goaXRlbSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmV0dXJuIHsgZmllbGRzLCByb3dzIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbXBvcnREYXRhKGNvbHVtbnM6IGFueVtdLCBmaWVsZHM6IHN0cmluZ1tdLCByb3dzOiBhbnlbXSkge1xyXG4gIGxldCB0YWJsZUZpZWxkczogc3RyaW5nW10gPSBbXVxyXG4gIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgIGxldCBmaWVsZDogc3RyaW5nID0gY29sdW1uLnByb3BlcnR5XHJcbiAgICBpZiAoZmllbGQpIHtcclxuICAgICAgdGFibGVGaWVsZHMucHVzaChmaWVsZClcclxuICAgIH1cclxuICB9KVxyXG4gIHJldHVybiB0YWJsZUZpZWxkcy5ldmVyeSgoZmllbGQ6IHN0cmluZykgPT4gZmllbGRzLmluY2x1ZGVzKGZpZWxkKSlcclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0WExTWChwYXJhbXM6IGFueSkge1xyXG4gIGNvbnN0IHsgJHRhYmxlLCBjb2x1bW5zLCBvcHRpb25zLCBmaWxlIH0gPSBwYXJhbXNcclxuICBjb25zdCB7IF9pbXBvcnRDYWxsYmFjaywgX2ltcG9ydFJlc29sdmUgfSA9ICR0YWJsZVxyXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXHJcbiAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IFhMU1gucmVhZChlLnRhcmdldC5yZXN1bHQsIHsgdHlwZTogJ2JpbmFyeScgfSlcclxuICAgIGNvbnN0IGNzdkRhdGE6IHN0cmluZyA9IFhMU1gudXRpbHMuc2hlZXRfdG9fY3N2KHdvcmtib29rLlNoZWV0cy5TaGVldDEpXHJcbiAgICBjb25zdCByZXN0OiBhbnkgPSBwYXJzZUNzdihjb2x1bW5zLCBjc3ZEYXRhKVxyXG4gICAgY29uc3QgeyBmaWVsZHMsIHJvd3MgfSA9IHJlc3RcclxuICAgIGNvbnN0IHN0YXR1cyA9IGNoZWNrSW1wb3J0RGF0YShjb2x1bW5zLCBmaWVsZHMsIHJvd3MpXHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgICR0YWJsZS5jcmVhdGVEYXRhKHJvd3MpXHJcbiAgICAgICAgLnRoZW4oKGRhdGE6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAnYXBwZW5kJykge1xyXG4gICAgICAgICAgICAkdGFibGUuaW5zZXJ0QXQoZGF0YSwgLTEpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkdGFibGUucmVsb2FkRGF0YShkYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIGlmIChvcHRpb25zLm1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgJHRhYmxlLiRYTW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IGkxOG4oJ3Z4ZS50YWJsZS5pbXBTdWNjZXNzJyksIHN0YXR1czogJ3N1Y2Nlc3MnIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlICE9PSBmYWxzZSkge1xyXG4gICAgICAkdGFibGUuJFhNb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogaTE4bigndnhlLmVycm9yLmltcEZpZWxkcycpLCBzdGF0dXM6ICdlcnJvcicgfSlcclxuICAgIH1cclxuICAgIGlmIChfaW1wb3J0UmVzb2x2ZSkge1xyXG4gICAgICBfaW1wb3J0UmVzb2x2ZShzdGF0dXMpXHJcbiAgICAgICR0YWJsZS5faW1wb3J0UmVzb2x2ZSA9IG51bGxcclxuICAgIH0gZWxzZSBpZiAoX2ltcG9ydENhbGxiYWNrKSB7XHJcbiAgICAgIC8vIOW3suW6n+W8g1xyXG4gICAgICBfaW1wb3J0Q2FsbGJhY2soc3RhdHVzKVxyXG4gICAgICAkdGFibGUuX2ltcG9ydENhbGxiYWNrID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxuICBmaWxlUmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVJbXBvcnRFdmVudChwYXJhbXM6IGFueSkge1xyXG4gIGlmIChwYXJhbXMub3B0aW9ucy50eXBlID09PSAneGxzeCcpIHtcclxuICAgIGltcG9ydFhMU1gocGFyYW1zKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVFeHBvcnRFdmVudChwYXJhbXM6IGFueSkge1xyXG4gIGlmIChwYXJhbXMub3B0aW9ucy50eXBlID09PSAneGxzeCcpIHtcclxuICAgIGV4cG9ydFhMU1gocGFyYW1zKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICog5Z+65LqOIHZ4ZS10YWJsZSDooajmoLznmoTlop7lvLrmj5Lku7bvvIzmlK/mjIHlr7zlh7ogeGxzeCDmoLzlvI9cclxuICovXHJcbmV4cG9ydCBjb25zdCBWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1g6IGFueSA9IHtcclxuICBpbnN0YWxsKHh0YWJsZTogdHlwZW9mIFZYRVRhYmxlKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKHh0YWJsZS50eXBlcywgeyB4bHN4OiAxIH0pXHJcbiAgICB4dGFibGUuaW50ZXJjZXB0b3IubWl4aW4oe1xyXG4gICAgICAnZXZlbnQuaW1wb3J0JzogaGFuZGxlSW1wb3J0RXZlbnQsXHJcbiAgICAgICdldmVudC5leHBvcnQnOiBoYW5kbGVFeHBvcnRFdmVudFxyXG4gICAgfSlcclxuICAgIFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWC50ID0geHRhYmxlLnRcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGkxOG4oa2V5OiBzdHJpbmcpIHtcclxuICBpZiAoVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYLnQpIHtcclxuICAgIHJldHVybiBWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1gudChrZXkpXHJcbiAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZYRVRhYmxlKSB7XHJcbiAgd2luZG93LlZYRVRhYmxlLnVzZShWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1gpXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWFxyXG4iXX0=